用不同的语言编译同一个文件两次的惯用方法是啥?
Posted
技术标签:
【中文标题】用不同的语言编译同一个文件两次的惯用方法是啥?【英文标题】:What's the idiomatic way to compile the same file twice, with different languages?用不同的语言编译同一个文件两次的惯用方法是什么? 【发布时间】:2021-12-07 05:44:52 【问题描述】:我有一个(至少)两种语言有效的源文件。比如说,C 和 C++ 或 C 和 CUDA。
我想用两种语言编译这个文件,每次都编译到不同的库中。在最新版本的 CMake 中这样做的惯用方式是什么?
注意事项:
如果 CMake 的特定版本很重要,请指定我需要的最低版本。 相关:How can I configure cmake to compile a file twice with two different compilers?【问题讨论】:
那么为什么不只是 1. 复制文件。 2.一个编译一个,一个复制。 @KamilCuk:我为什么要复制文件?这是一个文件,而不是两个文件。如果您的意思是在生成期间复制文件 - 那将非常糟糕,因为那时我将没有有效的调试信息。Why would I want to copy the file?
用不同的语言编译它。 If you mean copy the file during generation
何时 并不重要,但与add_custom_command
无关。 LANGUAGE
属性是用文件名索引的,所以要用不同的语言编译同一个文件,你必须有不同的文件名,所以只需复制它。
@KamilCuk:我可以为另一种语言创建一个完全独立的项目。事实上,我的完美克隆会写它。无论如何,这行不通。它必须是同一个文件,而不是副本。我知道 LANGUAGE
属性是按文件名索引的,这就是我想要解决的问题。
我 认为 source_properties 的范围是目录,所以你可以考虑做类似set(USELANG C) add_subdirectory(dir uses_c) set(USELANG CXX) add_subdirectory(dir uses_cxx)
和dir/CMakeLists.txt
中的set_source_file_properties(file.c_or_cpp PROPERTIES LANGAUGE $USELANG)
。请尝试。
【参考方案1】:
这在我注意到评论之前写的关于 OP 的评论中详细阐述了 @KamilCuk 的建议。
LANGUAGE 属性是在源文件本身上设置的,这是您问题的核心。此属性的documentation 描述它在设置它的目录范围内可见。这意味着拥有不同语言的一种方法是在两个不同的目录中设置属性。例如:
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 设置。
文档还暗示能够针对其他目录范围(包括二进制目录)显式设置属性。我希望这有助于简化工作,但我无法让它发挥作用。
【讨论】:
【参考方案2】:因为,确实,LANGUAGE
是每个文件的属性,我相信应该发生的事情 - 并且在这里允许一个适当的习惯用法 - 是对(目标,源文件)。
我已经在 issue report (gitlab.kitware.com) 中向 KitWare 提出了这个建议。
【讨论】:
以上是关于用不同的语言编译同一个文件两次的惯用方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章