假设我有一个双重用途的头文件,它可以用作头文件或由预处理器开关 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 立即链接,而无需先编译。
答案 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)