CMake如何链接多个.so共享库?导入库符号查找失败求解
CMake共享库依赖链接问题解决方法
问题核心
你遇到的问题源于两个关键疏漏:一是导入共享库时使用了错误的CMake命令,导致依赖配置未生效;二是运行时程序无法定位到libB.so和libC.so的路径,进而触发符号解析失败。
修正方案
1. 修正导入库的CMake代码
你代码中的add_target是错误命令,CMake导入已有共享库需使用add_library,同时需正确配置导入库的属性:
# 导入libA.so add_library(A SHARED IMPORTED GLOBAL) set_target_properties(A PROPERTIES IMPORTED_LOCATION "pathToSoFile/libA.so" # 若libA.so未设置SONAME,启用此属性帮助CMake正确处理依赖 IMPORTED_NO_SONAME TRUE ) # 导入libB.so add_library(B SHARED IMPORTED GLOBAL) set_target_properties(B PROPERTIES IMPORTED_LOCATION "pathToSoFile/libB.so" IMPORTED_NO_SONAME TRUE ) # 导入libC.so add_library(C SHARED IMPORTED GLOBAL) set_target_properties(C PROPERTIES IMPORTED_LOCATION "pathToSoFile/libC.so" IMPORTED_NO_SONAME TRUE ) # 将B和C设置为A的INTERFACE依赖,确保链接main时自动传递依赖 target_link_libraries(A INTERFACE B C)
2. 主目标的链接与运行时路径配置
在主CMakeLists.txt中,除了链接A,还需设置运行时库路径,确保程序能找到所有依赖的.so文件:
add_library(main SHARED main.cpp) # 链接A,B和C会通过INTERFACE自动传递 target_link_libraries(main PRIVATE A) # 设置编译和安装时的运行时库搜索路径 set_target_properties(main PROPERTIES BUILD_RPATH "pathToSoFile" INSTALL_RPATH "pathToSoFile" )
临时验证方案
如果上述配置仍有问题,可通过以下方式快速验证:
- 运行程序时手动指定库路径:
LD_LIBRARY_PATH=pathToSoFile ./main - 不推荐但可行的方式:使用
link_directories指定库搜索目录(CMake官方更推荐导入库的方式):link_directories("pathToSoFile") add_library(main SHARED main.cpp) target_link_libraries(main PRIVATE A B C)
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

