CMake调用target_link_libraries时同目录下静态与共享库优先链接哪一个
CMake同目录下静态/共享库的链接优先级
结论
默认配置下,CMake会优先选择链接共享库(动态库)。
具体原因
- CMake的库查找逻辑由内置变量
CMAKE_FIND_LIBRARY_SUFFIXES控制查找的文件后缀优先级,该变量的默认排序是共享库后缀在前,静态库后缀在后:- Linux平台默认顺序:
.so>.a - macOS平台默认顺序:
.dylib>.a - Windows平台默认顺序:
.dll对应的导入库.lib> 静态库.lib(Windows下动态库的导入库和静态库后缀同名,CMake会优先识别带有动态库导入标识的文件)
- Linux平台默认顺序:
- 当你不带后缀传入库名调用
target_link_libraries时,CMake会按照CMAKE_FIND_LIBRARY_SUFFIXES的顺序遍历搜索目录,只要先匹配到对应后缀的库文件就会停止查找,所以同目录下的共享库会被优先选中。
调整优先级的方法
如果需要强制优先链接静态库,可以手动修改CMAKE_FIND_LIBRARY_SUFFIXES的顺序,将静态库后缀放到最前面,示例配置如下:
set(CMAKE_FIND_LIBRARY_SUFFIXES .a .so .dylib)
也可以直接在target_link_libraries中传入带完整后缀的库名,显式指定链接类型。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

