我有一个源文件,它在(至少)两种语言中有效。比如,C和c++或者C和CUDA。
我想用两种语言编译这个文件,每次编译成不同的库。在最近的CMake版本中,做这件事的惯用方法是什么?
指出:
- 如果CMake的特定版本很重要,请指定我需要的最小版本。
- 相关:我如何配置cmake编译一个文件两次与两个不同的编译器?
这篇文章详细阐述了@KamilCuk在OP评论中的建议,在我注意到评论之前写的。
LANGUAGE属性是在源文件本身上设置的,这是您的问题的核心。此属性的文档描述了它在设置它的目录范围内是可见的。这意味着拥有不同语言的一种方法是在两个不同的目录中设置属性。例如:
src/
CMakeLists.txt
common/
main.c
app1/
CMakeLists.txt
app2/
CMakeLists.txt
src/CMakeLists.txt:
add_subdirectory(app1)
add_subdirectory(app2)
app1/CMakeLists.txt:
set_property(SOURCE ../common/main.c PROPERTY LANGUAGE CXX)
add_executable(app1 ../common/main.c)
app2/CMakeLists.txt:
set_property(SOURCE ../common/main.c PROPERTY LANGUAGE C)
add_executable(app2 ../common/main.c)
这将构建main.c到两个不同的目标,使用两种不同的语言设置。
文档还暗示能够针对其他目录范围(包括二进制目录)显式地设置该属性。我希望这能使工作简单些,但是我不能使它工作。
由于LANGUAGE
确实是每个文件的属性,因此我认为应该发生的事情—并且允许在这里使用适当的习惯用法—是对(目标文件,源文件)具有语言使用的二进制关系。
我已经在问题报告(gitlab.kitware.com)中向KitWare建议了这一点。