如何在 gn 中包含共享库

Posted

技术标签:

【中文标题】如何在 gn 中包含共享库【英文标题】:How to include a shared library in gn 【发布时间】:2021-05-07 10:13:06 【问题描述】:

我有一个 BUILD.gn,我想在其中包含一个位于 usr/lib 的共享库。 我已经参考了这个话题How to include a shared library in chromium's gn file?

但是 .so 文件没有与主函数链接。下面是BUILD.gn代码:-

executable("check") 
  sources = [ "check.cpp" ]
  deps = [
    ":SampleCheck",
    ]
  lib_dirs = [ "//usr/lib/SampleFile.so" ]
  libs = [ "SampleFile" ]

shared_library("SampleCheck") 
  sources = [
    "SampleCheck.h", // Header file for functions
  ]

但是,执行此操作时出现错误:-

ninja: Entering directory `out'
[0/1] Regenerating ninja files
[1/1] LINK main
FAILED: main 
g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -L../usr/lib/SampleFile.so -o main -Wl,--start-group @main.rsp  -Wl,--end-group -lSampleDll.so
/usr/bin/ld: cannot find -lSampleDll.so
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

我调查了许多网站,但我不知道我哪里错了?

【问题讨论】:

【参考方案1】:

这条线看起来很可疑:

  lib_dirs = [ "//usr/lib/sampleFile.so" ]

GN 使用// 来表示GN 项目的根,以.gn 文件的存在为标志。 lib_dirs 知道绝对文件系统允许像你这样的结构;您可以只使用一个正斜杠来指示根文件系统。

另外,lib_dirs 的目的是将 directories 添加到链接器的搜索路径:https://gn.googlesource.com/gn/+/master/docs/reference.md#var_lib_dirs

你给它的是一个文件,而不是一个目录。

请尝试:

  lib_dirs = [ "/usr/lib" ]

这应该将您的链接行更改为

g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -L/usr/lib -o main -Wl,--start-group @main.rsp  -Wl,--end-group -lSampleDll.so

这可能更接近您的预期;链接器看到所需的SampleDll.so 并将搜索/usr/lib

【讨论】:

以上是关于如何在 gn 中包含共享库的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET Core Docker 映像中包含共享 C 库 (.SO)

如何在 GNUMakefile 中包含 libxml2 库

如何在Github Pages页面中包含下载链接到任意文件?

如何在 CodeIgniter 中包含外部库?

如何在vue js中包含jquery库以及如何调用? [复制]

在 Xcode 静态库中包含框架?