出于测试目的,我尝试将库链接到简单的 hello world。
这是构建命令:
g++ -ohello -I. -L. -llibtensorflow_framework.so.2.15.0 hello.cpp
这是工作目录的内容:
-rw-r--r-- 1 rodolfo wheel 97 8 Feb 01:15 hello.cpp
-r-xr-xr-x 1 rodolfo wheel 42353984 23 Gen 17:58 libtensorflow_framework.2.15.0.dylib
-r-xr-xr-x 1 rodolfo wheel 65647 23 Gen 14:42 libtensorflow_framework.2.15.0.dylib-2.params
lrwxr-xr-x 1 rodolfo wheel 36 23 Gen 17:58 libtensorflow_framework.2.dylib -> libtensorflow_framework.2.15.0.dylib
lrwxr-xr-x 1 rodolfo wheel 31 23 Gen 17:58 libtensorflow_framework.dylib -> libtensorflow_framework.2.dylib
lrwxr-xr-x 1 rodolfo wheel 33 23 Gen 17:58 libtensorflow_framework.so.2 -> libtensorflow_framework.so.2.15.0
-r-xr-xr-x 1 rodolfo wheel 42353984 23 Gen 17:58 libtensorflow_framework.so.2.15.0
-r-xr-xr-x 1 rodolfo wheel 65641 23 Gen 14:35 libtensorflow_framework.so.2.15.0-2.params
即使库文件存在并且位于同一文件夹中,以下是
g++
返回的错误:
ld: library not found for -llibtensorflow_framework.so.2.15.0
clang: error: linker command failed with exit code 1 (use -v to see invocation)
为什么
g++
找不到库文件,即使它位于同一文件夹中,并且我还在文件夹列表中添加了当前文件夹以进行链接?我运行的是 macOS Catalina v.10.15.7。
根据 g++ (GCC) 13.2.1 用户手册(与您使用的不同,但 -l 选项相当通用):
-图书馆
-l 库-l 选项由 GCC 直接传递给链接器。有关确切的详细信息,请参阅链接器文档。
反过来,GNU 加载程序版本 2.40-13.fc39 的用户手册条目(同样与您使用的不同,但相当通用)指出:
-l 名称规范
--library=名称规范将 namespec 指定的存档或目标文件添加到要链接的文件列表中。该选项可以使用任意多次。如果 namespec 的形式为 :filename,ld 将在库路径中搜索名为 filename 的文件,否则它将在库路径中搜索名为 libnamespec.a 的文件。
在支持共享库的系统上,ld 还可能搜索 libnamespec.a 以外的文件。具体来说,在 ELF 和 SunOS 系统上,ld 将在目录中搜索名为 libnamespec.so 的库,然后再搜索名为 libnamespec.a 的库。 (按照惯例,“.so”扩展名表示共享库。)请注意,此行为不适用于 :filename,它始终指定一个名为 filename 的文件。
简短的答案是 g++ 找不到库文件,因为您没有在
:
选项中包含 -l
,并且任何库目录中都没有名为 liblibtensorflow_framework.so.2.15.0.so
或 liblibtensorflow_framework.so.2.15.0.a
的文件。
以下是我的建议:
A计划
将
-llibtensorflow_framework.so.2.15.0
更改为 -l:libtensorflow_framework.so.2.15.0
B计划
请勿在库名称中包含
lib
。将 -llibtensorflow_framework.so.2.15.0
更改为 -ltensorflow_framework
并在本地目录中创建从 libtensorflow_framework.so
到 libtensorflow_framework.so.2.15.0
的链接
C 计划(可与 A 和 B 计划结合使用)
然而
-I.
和 -L.
可能有些危险。 -L.
特别是传递给链接器,到那时 .
可能不会引用同一目录。您可以尝试将 -I.
和 -L.
更改为 -I`pwd`
和 -L`pwd`