我(交叉)编译共享C库,支持许多不同的平台,这些平台由CMakeLists文件的层次结构处理。在这些文件中,有条件地生成了几个<strong>特定于平台的编译器标志(使用add_definitions()
)。我可以成功编译和链接源代码,导致相应的.so文件。
但是要在任何项目中使用该库,我也需要提供正确的头文件。 CMake的以下install
命令选择要复制的正确头文件,但不应用预处理器定义/包含的替换:
install(FILES ${headers} DESTINATION include/mylibrary)
那么如何生成/安装“后编译”头文件?
到目前为止我的想法:
add_definitions()
应该在COMPILE_DEFINITIONS变量中堆叠我的-D,可能在复制的原始标头上运行foreach
循环并替换define / include占位符?add_custom_command()
应用某些逻辑?编辑:正如Tsyvarev所指出的,有一个答案非常接近我的需求here,但遗憾的是并不是这样。总之,答案提供了两个选项:
configure_file()
。 我无法使用此方法,因为我不想更改库标题。 还有其他想法吗?
编辑2 :我可能需要详细说明我的声明,即CMake的install
命令没有替换定义。请看以下示例:
//sampleheader.hpp
#ifndef SAMPLEHEADER_HPP_
#define SAMPLEHEADER_HPP_
#include OS_SPECIFIC_HEADER
//...
现在我有一个类似这样的CMakeLists.txt文件:
# ...
if (${OS} MATCHES "arm-emblinux")
add_definitions(-DOS_SPECIFIC_HEADER="emblinuxHeader.hpp")
elseif (${OS} MATCHES "linux")
add_definitions(-DOS_SPECIFIC_HEADER="linuxHeader.hpp")
endif()
# ...
所有内容编译都很好,但是当调用上面的install
命令时,我的../include/目录中有一个头文件,其中仍然包含OS_SPECIFIC_HEADER占位符。当然,这不能适当地包含在任何开发项目中。