You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:27:00