Ubuntu22.04下CMake无法识别作为符号链接的.so文件问题
CMake链接符号链接库时出现找不到库的错误
环境
平台:Ubuntu22.04
初始文件情况
// 两个文件内容完全相同 // abc.so是原文件,libabc.so是其副本 // ${shared}为绝对路径 ${shared}/libabc.so ${shared}/abc.so
初始CMakeLists.txt内容
LINK_DIRECTORIES(${shared}) ADD_EXECUTABLE(main ...) TARGET_LINK_LIBRARIES(main libabc.so)
此时链接工作正常。后续操作:
- 删除
libabc.so副本 - 通过命令创建相对路径符号链接:
ln -s relative_path/shared/abc.so relative_path/shared/libabc.so
执行链接后出现报错:
/usr/bin/ld: cannot find -labc: No such file or directory collect2: error: ld returned 1 exit status
明明libabc.so符号链接已存在,为何会出现该错误?
原因及解决办法
原因
问题出在相对路径的符号链接上:
当ld(链接器)在构建阶段尝试读取libabc.so时,它会以自身当前的工作目录(通常是CMake的构建目录,比如build/)为基准去解析符号链接里的相对路径,而不是以符号链接所在的${shared}目录为基准。这就导致ld找不到目标文件abc.so,最终判定libabc.so无效,抛出找不到-labc的错误。
而之前的libabc.so是实际文件,不存在路径解析问题,因此能正常链接。
解决办法
使用绝对路径创建符号链接:
ln -s ${shared}/abc.so ${shared}/libabc.so这样无论ld在哪个工作目录,都能正确解析到目标文件
abc.so。直接链接原文件:
修改CMakeLists.txt中的链接指令,跳过符号链接:TARGET_LINK_LIBRARIES(main abc.so)
内容的提问来源于stack exchange,提问作者user5819540
相关产品推荐
相关产品推荐

