最近用到一个第三方开源项目bcc(https://github.com/iovisor/bcc),由于某些原因,需要采用chromium的GN构建系统,将bcc一起构建进quic项目中来。阅读完谷歌官方的GN文档后,如下是重要的配置项:
executable("my_project") {
sources = [#源码.c和.cc]
include_dirs = [#头文件]
lib_dirs = [ #增加链接时库的搜索目录]
libs = [#增加链接时依赖的静态库和动态库]
#还有很多其他配置例如cflags、configs等
#configs下配置的参数是可以传递给依赖项的,其他参数直接定义的无法传递
}
配置完后,开始用gn构建,然后ninja编译了。然后一堆问题,只能一一去解决了。
1.error: [chromium-style]
明显这是chromium特有的编写格式检查,用的是第三方库bcc,代码规范有很多不符合chromium规范要求的,怎么办呢?看来只能按着要求一一改第三方库了,具体每个错误如何改,官方链接有详细说明。
我把第三方库报错的格式规范都改了,终于可以处理了,但是过程真的太费时费力了。还有没有不改第三方库源码的方法呢,答案是有的,通过深读chromium根目录build文件下全部的gn文件,发现如下构建代码:
config("find_bad_constructs") {
if (clang_use_chrome_plugins) {
cflags = []
# The plugin is built directly into clang, so there's no need to load it
# dynamically.
cflags += [
"-Xclang",
"-add-plugin",
"-Xclang",
"find-bad-constructs",
]
if (is_linux || is_android || is_fuchsia) {
cflags += [
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-ipc",
]
}
}
}
这项配置由BUILDCONFIG.gn文件启用了,我们启动gn构建时,增加clang_use_chrome_plugins=false,即可避免chromium-style的格式检查。
2.error: exception handling disabled:
报出这个错,很明显gn构建工具默认加了-fno-exceptions 编译参数了,好吧,该怎么解决呢?
可以在自己写的gn文件内部加入cflags参数-fexceptions,但是这无法传递到第三方依赖库,可以内部配置configs解决这个问题。
3. error:undefined symbol:
编译通过,链接的时候出现这个错误,问题当然不是c和c++互相调用extern c的低级问题。具体错误可能参看这篇文章:
https://blog.csdn.net/Three_dog/article/details/104701644/
是不是文章所述的问题呢,用nm分别进去看了一下动态库.so和编译出来的.o里找不到的符号到底怎么写的:
很明显就是底层依赖库基础字符串不一致的问题了(libstdc++和libc++),问题找到,就很简单了,不一致换成一致就好了,改第三方库的基础依赖库,或者改chromium的依赖库就可以完成了。