如何在 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)
如何在Github Pages页面中包含下载链接到任意文件?