【问题标题】:How can I have CMake compile the same input file in two different languages?如何让 CMake 用两种不同的语言编译相同的输入文件?
【发布时间】:2021-09-21 20:01:07
【问题描述】:

我有一个名为foo.bar 的文件。我想将它编译为 C++ 文件一次,编译为 mycpplib 库目标,一次编译为 C 文件,编译为 myclib 目标;我想在同一个版本中使用相同的CMakeLists.txt

现在,我知道我可以任意设置源文件的关联语言,如下所示:

set_source_files_properties(foo.bar PROPERTIES LANGUAGE C)

但这看起来对我的情况没有帮助。在 CMake 级别有什么我可以做的吗?

注意事项:

  • 相关问题:The single-arbitrary-language case
  • 对此有非 CMake 解决方案,例如复制文件;使用具有不同名称的符号链接;有一个以#include "otherfile" 为内容的文件等。

【问题讨论】:

    标签: c++ c cmake build cross-language


    【解决方案1】:

    您可以在不同的目录(在不同的CMakeLists.txt)中创建库目标mycpplibmyclib。这样您就可以在创建mycpplib 库的目录中调用set_source_files_properties,并且该调用不会影响myclib

    命令set_source_files_properties 也有 DIRECTORY 和 TARGET_DIRECTORY 选项,这可能会影响属性可见的目录:

    # In 'c/CMakeLists.txt`
    # add_library(myclib ${CMAKE_SOURCE_DIR}/foo.bar)
    
    # In 'cpp/CMakeLists.txt`
    # add_library(mycpplib ${CMAKE_SOURCE_DIR}/foo.bar)
    
    # In CMakeLists.txt
    add_subdirectory(c)
    add_subdirectory(cpp)
    set_source_file_properties(foo.bar TARGET_DIRECTORY myclib
      PROPERTIES LANGUAGE C)
    set_source_file_properties(foo.bar TARGET_DIRECTORY mycpplib
      PROPERTIES LANGUAGE CXX)
    

    【讨论】:

    • 奇怪的是你不能为每个目标设置这个属性,周期。
    • 据我了解,CMake 具有 per-target 属性和 per-file 属性。但它缺少“每个文件每个目标”属性。 set_source_file_properties 的选项 DIRECTORYTARGET_DIRECTORY 只是帮助,它们不会引入额外的概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2015-03-29
    • 2021-12-07
    相关资源
    最近更新 更多