用不同的语言编译同一个文件两次的惯用方法是啥?

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 提出了这个建议。

【讨论】:

以上是关于用不同的语言编译同一个文件两次的惯用方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

编写和运行Java程序的步骤是啥?每一步的结果是啥?在JDK中,Java语言的编译命令是啥?急需答案啊。

使用Java语言编写的源程序保存时的文件扩展名是啥

使用Java语言编写的源程序保存时的文件扩展名是啥

解决onActivityResult方法调用两次的问题

java 是啥语言写的

在同一张桌子上加入两次的最佳方式是啥?