【问题标题】:CMake build - ld reports collect2 error, cannot find library, but paths to library are correctly set [duplicate]CMake build - ld 报告 collect2 错误,找不到库,但正确设置了库的路径 [重复]
【发布时间】:2021-11-28 08:51:50
【问题描述】:

我正在使用 CMake 3.19

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

这是我的 CMakeLists.txt 的相关 sn-p:

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

【问题讨论】:

  • 请运行 makeVERBOSE=1 (IIRC) 以查看所有正在使用的命令。链接命令是否正确?
  • -lcoolfoo 将查找名为libcoolfoo.so 的库,而您的库称为coolfoo.so 可以将coolfoo.so 重建为更标准的libcoolfoo.so 吗?否则,您可能需要使用 target_link_libraries 的其他变体,例如提供完整路径。
  • @Someprogrammerdude:请查看更新后的问题,输出为make V=1

标签: c cmake linker-errors ld


【解决方案1】:

在 Linux 上,当您要求链接器链接库 coolfoo(例如 -lcoolfoo)时,链接器将查找名为 libcoolfoo.so 的文件。

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

将您的库重命名(或构建)为libcoolfoo.so,链接器应该会找到它。或者使用实际库文件的完整路径 (${PROJECT_SOURCE_DIRECTORY}/lib/coolfoo.so)。

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 2016-06-28
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2018-02-07
    • 2018-09-16
    相关资源
    最近更新 更多