You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

此时链接工作正常。后续操作:

  1. 删除libabc.so副本
  2. 通过命令创建相对路径符号链接:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:52:36