0

我有一个 BUILD.gn,我想在其中包含一个位于usr/lib. 我已经参考了这个主题如何在铬的 gn 文件中包含共享库?

但是 .so 文件没有与 main 函数链接。以下是 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.

我调查了许多网站,但我没有得到我错在哪里?

4

1 回答 1

0

这条线看起来很可疑:

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

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

此外,目的lib_dirs是将目录添加到链接器的搜索路径: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它。

于 2022-02-06T16:03:56.413 回答