将头文件编译为 CMake 中的可执行文件

时间:2021-08-02 00:57:41

标签: c++ cmake

假设我有一个双重用途的头文件,它可以用作头文件或由预处理器开关 AS_CPP 控制的源文件。可以使用命令 g++ -x c++ -DAS_CPP foo.h -o foo 将其编译为可执行文件。

是否有可能以跨平台的方式在 CMake 中实现这一点(无需明确写出命令)?


尝试失败:

...
add_executable(foo EXCLUDE_FROM_ALL foo.h)
set_source_files_properties(foo.h PROPERTIES COMPILE_FLAGS "-x c++")
set_target_properties(eqtb PROPERTIES LINKER_LANGUAGE CXX)

这只会让 CMake 立即链接,而无需先编译。

2 个答案:

答案 0 :(得分:1)

<块引用>

我的情况是我有一个巨大的枚举 - 标题基本上有一个 int main(...) 用于在枚举器名称和值之间进行转换,并且只有在定义了 AS_CPP 时才定义了 main。

XY 问题的简单解决方案:根本不要在标题中定义 <ItemGroup> <ProjectReference Include="../../Common/Common.csproj" Condition="Exists('../../Common')'"/> <ProjectReference Include="../../../Common/Common.csproj" Condition="Exists('../../../Common')'"/> </ItemGroup> 。在您使用更传统的后缀命名的另一个文件中定义它。

答案 1 :(得分:0)

只需将文件复制到适当的后缀即可。

add_custom_command(
    COMMENT "Copying foo.h to foo.cpp"
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.cpp
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/foo.h
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_CURRENT_SOURCE_DIR}/foo.h
        ${CMAKE_CURRENT_BINARY_DIR}/foo.cpp
)
add_executable(foo ${CMAKE_CURRENT_BINARY_DIR}/foo.cpp)