ld即使在同一个文件夹中也找不到库文件

问题描述 投票:0回答:1

出于测试目的,我尝试将库链接到简单的 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。

c++ macos g++ ld
1个回答
0
投票

根据 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`

© www.soinside.com 2019 - 2024. All rights reserved.