CMake如何使用无版本号的库名称
解决CMake无需指定版本号链接带版本号库的问题
这里提供两种无需修改CMake配置即可适配库版本更新的方案,均直接在CMakeLists.txt中实现:
方案一:创建无版本号符号链接
通过CMake的file(GLOB)匹配带版本号的库文件,再创建无版本号的符号链接,之后就能像普通库一样链接:
# 匹配目标库文件(可根据实际路径调整PATHS) file(GLOB SOME_LIB_FILE "${CMAKE_PREFIX_PATH}/lib/libSomeLib-*.so") # 检查是否成功找到库 if(NOT SOME_LIB_FILE) message(FATAL_ERROR "未找到libSomeLib-*.so格式的库文件") endif() # 定义创建符号链接的命令 add_custom_command( OUTPUT "${CMAKE_PREFIX_PATH}/lib/libSomeLib.so" COMMAND ${CMAKE_COMMAND} -E create_symlink "${SOME_LIB_FILE}" "${CMAKE_PREFIX_PATH}/lib/libSomeLib.so" DEPENDS "${SOME_LIB_FILE}" ) # 创建自定义目标,确保编译前完成符号链接创建 add_custom_target(CreateSomeLibSymlink ALL DEPENDS "${CMAKE_PREFIX_PATH}/lib/libSomeLib.so") # 链接库时依赖该目标,避免链接时符号链接未生成 add_executable(YourApp main.cpp) add_dependencies(YourApp CreateSomeLibSymlink) target_link_libraries(YourApp PRIVATE SomeLib)
注意:如果库安装在系统目录(如/usr/lib),创建符号链接可能需要root权限,开发阶段建议使用本地安装路径避免权限问题。
方案二:直接匹配并链接带版本号的库
利用find_library支持通配符的特性,直接定位带版本号的库文件,无需创建符号链接:
# 查找带版本号的库文件(NAMES参数支持通配符) find_library(SOME_LIB NAMES libSomeLib-*.so PATHS "${CMAKE_PREFIX_PATH}/lib" ) if(NOT SOME_LIB) message(FATAL_ERROR "未找到libSomeLib相关库文件") endif() # 直接链接找到的库文件,无需指定版本号 add_executable(YourApp main.cpp) target_link_libraries(YourApp PRIVATE "${SOME_LIB}")
这种方法更轻量化,无需修改系统或安装目录的文件,适合不想创建额外符号链接的场景。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

