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规范的问题:
- 使用了过时的
include_directories指定目标头文件,而非更推荐的target_include_directories - 已指定
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 )
额外检查项
- 确认云端构建环境中
third-party/ccalib_mdf/lib目录下确实存在libccalib_mdf-2-2-1.so,未被遗漏或路径错误 - 如果该库是软链接,需确保链接指向的目标文件同样存在
- 确认CMake版本≥3.13(
target_link_directories的最低支持版本),若版本过低可改用link_directories,但优先推荐现代CMake语法
内容的提问来源于stack exchange,提问作者The_Artineer
相关产品推荐
相关产品推荐

