chromium构建工具GN的坑:error: [chromium-style]、 exception handling disabled、undefined symbol等

    最近用到一个第三方开源项目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的依赖库就可以完成了。

猜你喜欢

转载自blog.csdn.net/csdn_idiot/article/details/106358305