CMake 不编译具有非标准扩展名的文件

Posted

技术标签:

【中文标题】CMake 不编译具有非标准扩展名的文件【英文标题】:CMake does not compile files with non-standard extensions 【发布时间】:2019-12-27 11:10:16 【问题描述】:

我有一个项目,其中包含自定义脚本,可自动生成具有非标准扩展名的 C++ 代码文件(.acpp 和 .ah 分别用于生成的源文件和头文件)。但是,此代码未编译,因为编译时出现链接器错误,将文件从 .acpp 重命名为 .cpp 时会消失。

set(HEADER_FILES
    normal.h
    foo.ah
)


set(SOURCE_FILES
    normal.cpp
    foo.acpp
)

add_library(lib STATIC $SOURCE_FILES $HEADER_FILES)

在上述情况下,只有 normal.cpp 被编译,如果它调用 foo.acpp 中定义的函数,就会出现链接器错误。

我尝试过使用:

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS acpp) SET_SOURCE_FILES_PROPERTIES($SOURCE_FILES PROPERTIES LANGUAGE CXX) add_definitions("-x c++") set_target_properties(lib PROPERTIES LINKER_LANGUAGE CXX)

并查看了这些相关问题:

CMake and non-standard extensions https://cmake.org/pipermail/cmake/2015-March/060137.html

【问题讨论】:

别人用一点技巧解决了这个问题:***.com/questions/25935811/… 我会看看那个,但我希望有更好的方法来做到这一点(不必依赖外部脚本语言) 谢谢。您是对的,只是将其编辑为正确的,我是在没有自动完成的情况下将其从内存中输入的。即使使用正确的语法,它也不起作用。 SET_SOURCE_FILES_PROPERTIES(foo.acpp PROPERTIES LANGUAGE CXX)。这在过去对我有用。它添加了适当的标志来将源代码编译为请求的语言如果您使用的生成器不支持此设置,我建议使用 CMake 提交错误。否则,您只需使用 -x c++ 在源文件上设置 COMPILE_OPTIONS 属性。 【参考方案1】:

使用 CMake 3.22.0 set_source_files_properties(file.nonstandard_extention PROPERTIES LANGUAGE C)LANGUAGE CXX 可以将文件视为 C 或 C++。在 MacOS AppleClang 13.0 上进行测试。请参阅 CMake 文档here。

【讨论】:

以上是关于CMake 不编译具有非标准扩展名的文件的主要内容,如果未能解决你的问题,请参考以下文章

“警告 C4987:使用了非标准扩展:'throw (...)'”是啥意思?

如何独立于标准启用 GCC 的 GNU 扩展?

Java 源程序文件编译后产生的文件称为________文件,其扩展名为 ________ 。

CMake 编译报一堆“注意:包含文件”的问题

VS的 X64下的汇编编译

具有扩展名 .woff 的 Rails 5 字体文件不能在 AWS EB 中进行预编译