如何让CMake在Mac与Ubuntu生成相同扩展名的共享库?
解决跨平台共享库扩展名统一问题
CMake默认会根据操作系统设置共享库后缀:Mac生成.dylib,Linux生成.so。要让两个平台生成相同扩展名的共享库,有两种简单实现方式:
方式一:全局统一所有共享库后缀
在cmake_minimum_required之后、project之前添加全局配置,强制所有共享库使用同一后缀(推荐统一为.so,跨平台兼容性更好):
cmake_minimum_required(VERSION 3.16) # 强制所有共享库使用.so后缀,跨平台统一 set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") set (CMAKE_CXX_STANDARD 17) set(CMAKE_POSITION_INDEPENDENT_CODE ON) project(BICS_ABM)
方式二:仅针对目标库设置后缀
如果只想让BICS_ABM_lib这个库统一后缀,在add_library代码块之后添加目标属性配置:
add_library(BICS_ABM_lib SHARED src/BICS_ABM.h src/print_attributes.cpp src/decrement.cpp src/set_sick.cpp src/transmit.cpp src/distribute_vax.cpp src/history.cpp src/BICS_ABM.cpp src/py_defs.cpp src/params.cpp src/mixing.cpp ) # 为该库指定固定后缀 set_target_properties(BICS_ABM_lib PROPERTIES SUFFIX ".so")
补充说明
- 统一使用
.so后缀是更稳妥的选择:MacOS的Python ctypes可以正常加载.so文件,Linux系统也原生支持,无需额外适配。如果偏好统一为.dylib,只需把上述代码中的.so替换成.dylib即可,但Linux下Python对该扩展名的识别兼容性略逊于.so。 - 你的CMakeLists.txt中测试部分存在小问题:
add_test的目标应该是BICS_ABM_tests而非BICS_ABM,修正后如下:
add_test(Vax_tests BICS_ABM_tests) add_test(DataTests BICS_ABM_tests) add_test(DecrementTests BICS_ABM_tests)
内容的提问来源于stack exchange,提问作者Ethan Roubenoff
相关产品推荐
相关产品推荐

