当前位置: 首页 > 知识库问答 >
问题:

CMake build-ld报告collect2错误,找不到库,但库的路径设置正确[duplicate]

赏彭薄
2023-03-14

我用的是Cmake 3.19

我正在编译一个C应用程序,它在${PROJECT_SOURCE_DIRECTORY}/lib文件夹中导入第三方共享库。

以下是我的CMakeLists的相关片段。txt:

target_link_directories(TargetApp PUBLIC "/usr/local/lib"
                                     ${PROJECT_SOURCE_DIRECTORY}/lib )  


get_target_property(OUT TargetApp LINK_DIRECTORIES)
#message("directories:" ${OUT})                                     


target_link_libraries(TargetApp 
  "m"
  "coolfoo"
)  


get_target_property(OUT TargetApp LINK_LIBRARIES)
#message("linked libs:" ${OUT})  

控制台上的消息显示链接路径正确,并且正确的库也正确添加。

最后,但并非最不重要的一点是,我使用ldd检查第三方库中是否有任何缺少的符号(没有缺少的符号)。

下面是ldd输出:

ldd  ../lib/coolfoo.so 
linux-vdso.so.1 (0x00007ffd63d5f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f81966c5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f81964d3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f81969ac000)

在CMake Makefile上运行make时,出现以下错误(在链接阶段):

[ 16%] Linking C executable TargetApp
/usr/bin/ld: cannot find -lcoolfoo
collect2: error: ld returned 1 exit status

为什么ld找不到我的共享库?我该如何解决这个问题?

[[编辑]]

make V=1的输出

[Fri, 08Oct21 12:49 minime@yourbox]:build$ make V=1
/home/minime/.local/bin/cmake -S/path/to/proj -B/path/to/proj/build --check-build-system CMakeFiles/Makefile.cmake 0
/home/minime/.local/bin/cmake -E cmake_progress_start /path/to/proj/build/CMakeFiles /path/to/proj/build//CMakeFiles/progress.marks
make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/path/to/proj/build'
make  -f CMakeFiles/TargetApp.dir/build.make CMakeFiles/TargetApp.dir/depend
make[2]: Entering directory '/path/to/proj/build'
cd /path/to/proj/build && /home/minime/.local/bin/cmake -E cmake_depends "Unix Makefiles" /path/to/proj /path/to/proj /path/to/proj/build /path/to/proj/build /path/to/proj/build/CMakeFiles/TargetApp.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/path/to/proj/build'
make  -f CMakeFiles/TargetApp.dir/build.make CMakeFiles/TargetApp.dir/build
make[2]: Entering directory '/path/to/proj/build'
[ 16%] Linking C executable TargetApp
/home/minime/.local/bin/cmake -E cmake_link_script CMakeFiles/TargetApp.dir/link.txt --verbose=1
/usr/bin/cc CMakeFiles/TargetApp.dir/src/server/example-server.c.o CMakeFiles/TargetApp.dir/src/server/dirlookup.pb-c.c.o CMakeFiles/TargetApp.dir/src/server/query.pb-c.c.o -o TargetApp   -L/usr/local/lib  -L/path/to/proj/lib  -Wl,-rpath,/usr/local/lib:/path/to/proj/lib -lm -lprotobuf-c -lprotobuf-c-rpc -lcoolfoo 
/usr/bin/ld: cannot find -lcoolfoo
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/TargetApp.dir/build.make:151: TargetApp] Error 1
make[2]: Leaving directory '/path/to/proj/build'
make[1]: *** [CMakeFiles/Makefile2:95: CMakeFiles/TargetApp.dir/all] Error 2
make[1]: Leaving directory '/path/to/proj/build'
make: *** [Makefile:103: all] Error 2

共有1个答案

越源
2023-03-14

Linux,当您要求链接器链接到库ool foo(例如-lool foo)时,链接器将查找名为libcoolfoo.so的文件。

使用-l选项查找库时,lib前缀是必需的。

将库重命名(或构建)为libcoolfoo。因此链接器应该能找到它。或者使用实际库文件的完整路径(${PROJECT\u SOURCE\u DIRECTORY}/lib/coolfoo.so)。

 类似资料:
  • 我不能编译yacc I lex: 输出错误:

  • 问题内容: 我正在尝试在此Debian lenny系统上使用g ++链接应用程序。ld抱怨找不到指定的库。这里的特定示例是ImageMagick,但是其他一些库也遇到类似的问题。 我通过以下方式调用链接器: ld抱怨: 但是,libmagic存在: 如何进一步诊断此问题,可能出什么问题了?我在做些完全愚蠢的事情吗? 问题答案: 问题是链接器正在寻找,但是您只有 一个快速的技巧是符号链接到

  • 问题内容: 我正在尝试使用python 3在OSX high sierra上的virtrualenv中安装mysqlclient,并得到以下错误: 尝试过但没有用。我已经在同一台计算机上安装了mysql服务器。 问题答案: 升级到osx Mojave和python 3.7.2后,我遇到了同样的问题。这对我有用: 希望能帮助到你。有关更多信息,请参见此处。

  • 我在/usr/local/lib中有libcommon.so,我在程序中链接了这个库。 gcc -o测试test _ Prog . c-L/usr/local/lib-llib common . so 我也试过这个 gcc -o test test_prog.c -L/usr/local/lib -llibcommon 是给予 /usr/bin/ld: 找不到 -llibcommon.so 收集

  • 问题内容: 链接期间出现以下警告: 设置环境变量LD_LIBRARY_PATH = path_to_libxxx.so.6可使警告静音(添加-Lpath_to_libxxx.so.6无效)。 我有一个单独的编译服务器,仅在其中编译生成的二进制文件。二进制文件是在其他服务器上执行的,在那里二进制文件可以看到libxxx.so.6(用选中)。 还有其他方法可以消除编译时的警告(我已经警告过几次了,这很