CMake中同一源文件按两种不同语言编译生成不同库的惯用做法
CMake 单源文件多语言编译生成独立库的规范实现
最低版本要求
最低支持CMake 3.10,若涉及CUDA语言原生编译,建议使用3.18及以上版本获得更完善的CUDA规则支持。
实现逻辑
核心采用OBJECT 中间库的方案,对同一份源文件在不同目标下单独指定语言编译属性,避免编译规则冲突,最终基于不同中间产物生成独立的库文件。
实现步骤
- 启用项目所需的全部目标语言,示例为同时支持C和C++:
project(multi_lang_lib C CXX)
如果是C和CUDA组合则改为:
project(multi_lang_lib C CUDA)
- 为每种语言分别声明OBJECT中间库,显式指定源文件的编译语言属性,
TARGET_DIRECTORY参数限定属性仅在当前目标下生效:
# C 版本中间库 add_library(shared_c OBJECT common_source.c) set_source_files_properties(common_source.c TARGET_DIRECTORY shared_c PROPERTIES LANGUAGE C ) # 单独配置C版本的编译参数、宏、头文件路径等 target_compile_options(shared_c PRIVATE -std=c11 -Wall) target_compile_definitions(shared_c PRIVATE BUILD_FOR_C=1) # C++ 版本中间库 add_library(shared_cxx OBJECT common_source.c) set_source_files_properties(common_source.c TARGET_DIRECTORY shared_cxx PROPERTIES LANGUAGE CXX ) # 单独配置C++版本的编译参数、宏、头文件路径等 target_compile_options(shared_cxx PRIVATE -std=c++17 -Wall) target_compile_definitions(shared_cxx PRIVATE BUILD_FOR_CXX=1)
- 基于中间库生成最终的独立库文件,使用不同的命名区分:
add_library(my_c_lib $<TARGET_OBJECTS:shared_c>) add_library(my_cxx_lib $<TARGET_OBJECTS:shared_cxx>)
补充说明
- 若需要生成静态/动态库,可在最终
add_library时添加STATIC或SHARED参数,例如add_library(my_c_lib SHARED $<TARGET_OBJECTS:shared_c>) - CUDA场景下只需将上述CXX相关配置替换为CUDA即可,对应设置
LANGUAGE CUDA,以及CUDA专用的编译选项。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

