如何配置CMake以链接指定版本的共享库libfoo.so.0.1.0
如何让CMake生成指定版本的共享库链接命令
当然可以实现你想要的效果!问题出在CMake对target_link_libraries参数的默认处理逻辑上——当你传入libfoo.so.0.1.0这样的库名时,CMake会自动剥离前缀lib和版本后缀,转换成链接器的-lfoo选项,这就是你当前看到的结果。
要让CMake生成-Llibs -l:libfoo.so.0.1.0的链接命令,有两种常用的方法:
方法一:直接传递链接器选项
GCC链接器(ld)支持-l:语法,它告诉链接器直接查找指定的完整文件名,而不是自动添加前缀和后缀。你可以在target_link_libraries中直接传递这个链接器选项:
cmake_minimum_required(VERSION 3.15) project(using_shared_library) add_executable(main main.c) target_link_directories(main PUBLIC libs) # 直接传递链接器的-l:选项 target_link_libraries(main PRIVATE "-l:libfoo.so.0.1.0")
这样CMake会把"-l:libfoo.so.0.1.0"原封不动地传递给链接器,最终生成的命令行就会包含你期望的-Llibs -l:libfoo.so.0.1.0。
方法二:创建IMPORTED库目标(更规范)
如果你需要更清晰地管理这个依赖库的属性(比如包含目录、编译选项等),可以创建一个IMPORTED库目标,明确指定它的路径:
cmake_minimum_required(VERSION 3.15) project(using_shared_library) add_executable(main main.c) # 创建一个IMPORTED共享库目标 add_library(foo SHARED IMPORTED) # 设置库的具体路径 set_target_properties(foo PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/libs/libfoo.so.0.1.0" ) # 链接这个IMPORTED目标 target_link_libraries(main PRIVATE foo)
这种方式的好处是,CMake会完全按照你指定的路径去链接库,不会自动修改库名,同时你还可以通过set_target_properties给这个目标添加更多属性(比如INTERFACE_INCLUDE_DIRECTORIES来指定头文件目录),更符合现代CMake的最佳实践。
两种方法都能满足你的需求,如果你只是简单链接库,方法一更快捷;如果需要管理库的更多依赖细节,方法二更合适。
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

