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

CMake链接第三方共享库报错:No rule to make target .so文件

问题:CMake构建时无法找到第三方共享库文件

项目目录结构

|-src
|---main.cpp
|-third-party
|---ccalib_mdf
|-----include
|-----lib
|-------libccalib_mdf-2-2-1.so
|---dbcppp
|-----include
|-------dbcppp
|-------libxmlmm
|---------include
|-----lib
|-------libdbcppp.so
|-------libxmlmm.so
|-CMakeLists.txt

当前CMake配置片段

添加可执行文件:

add_executable(mdf4_transcoder ${PROJECT_SOURCE_DIR}/main.cpp)  

引入头文件:

include_directories(mdf4_transcoder PRIVATE "third-party/ccalib_mdf/include")
include_directories(mdf4_transcoder PRIVATE "third-party/dbcppp/include/dbcppp")
include_directories(mdf4_transcoder PRIVATE "third-party/dbcppp/include/libxmlmm/include")

链接库配置:

target_link_directories(mdf4_transcoder PRIVATE "third-party/ccalib_mdf/lib")
target_link_directories(mdf4_transcoder PRIVATE "third-party/dbcppp/lib")

target_link_libraries(mdf4_transcoder Pcap++ Packet++ Common++ pcap pthread)
target_link_libraries(mdf4_transcoder ${CMAKE_SOURCE_DIR}/third-party/ccalib_mdf/lib/libccalib_mdf_x64_2-2-1.so )
target_link_libraries(mdf4_transcoder ${CMAKE_SOURCE_DIR}/third-party/dbcppp/lib/libdbcppp.so )
target_link_libraries(mdf4_transcoder ${CMAKE_SOURCE_DIR}/third-party/dbcppp/lib/libxmlmm.so)

构建错误信息

make[2]: *** No rule to make target '/usr/src/src/repair_service/transcoder/third-party/ccalib_mdf/lib/libccalib_mdf_x64_2-2-1.so', needed by 'mdf4_transcoder'.  Stop.

错误根源

从目录结构可见,实际存在的库文件是libccalib_mdf-2-2-1.so,但CMake配置中写的是libccalib_mdf_x64_2-2-1.so,文件名完全不匹配,导致构建系统找不到目标文件。

另外,当前CMake配置还存在两处不符合现代CMake规范的问题:

  1. 使用了过时的include_directories指定目标头文件,而非更推荐的target_include_directories
  2. 已指定target_link_directories的情况下,仍使用完整路径链接库,写法冗余且易出错

修复后的CMake配置

# 定义可执行文件(修正源文件路径,原配置未包含src目录)
add_executable(mdf4_transcoder ${PROJECT_SOURCE_DIR}/src/main.cpp)  

# 引入头文件(使用target_include_directories替代include_directories,路径用PROJECT_SOURCE_DIR保证绝对路径正确)
target_include_directories(mdf4_transcoder PRIVATE 
    "${PROJECT_SOURCE_DIR}/third-party/ccalib_mdf/include"
    "${PROJECT_SOURCE_DIR}/third-party/dbcppp/include/dbcppp"
    "${PROJECT_SOURCE_DIR}/third-party/dbcppp/include/libxmlmm/include"
)

# 指定库搜索目录
target_link_directories(mdf4_transcoder PRIVATE 
    "${PROJECT_SOURCE_DIR}/third-party/ccalib_mdf/lib"
    "${PROJECT_SOURCE_DIR}/third-party/dbcppp/lib"
)

# 链接库文件(修正ccalib_mdf的库名,并用简化写法:去掉lib前缀与.so后缀)
target_link_libraries(mdf4_transcoder PRIVATE
    Pcap++ Packet++ Common++ pcap pthread
    ccalib_mdf-2-2-1  # 对应实际存在的libccalib_mdf-2-2-1.so
    dbcppp            # 对应libdbcppp.so
    xmlmm             # 对应libxmlmm.so
)

额外检查项

  1. 确认云端构建环境中third-party/ccalib_mdf/lib目录下确实存在libccalib_mdf-2-2-1.so,未被遗漏或路径错误
  2. 如果该库是软链接,需确保链接指向的目标文件同样存在
  3. 确认CMake版本≥3.13(target_link_directories的最低支持版本),若版本过低可改用link_directories,但优先推荐现代CMake语法

内容的提问来源于stack exchange,提问作者The_Artineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:31:01