C++ 头文件上的CMake/make apply-D标志

C++ 头文件上的CMake/make apply-D标志,c++,makefile,cmake,C++,Makefile,Cmake,我正在(交叉)编译一个共享C库,它支持许多不同的平台,这些平台由CMakeLists文件的层次结构处理。在这些文件中,有条件地生成了几个特定于平台的编译器标志(使用add_definitions())。我可以成功地编译并链接源代码,从而生成适当的.so文件 但要在任何项目中使用该库,我也需要提供正确的头文件。CMake的以下install命令选择要复制的正确头文件,但不应用预处理器定义/包括的替换: install(文件${headers}目标包括/mylibrary) 那么如何生成/安装“后编

我正在(交叉)编译一个共享C库,它支持许多不同的平台,这些平台由CMakeLists文件的层次结构处理。在这些文件中,有条件地生成了几个特定于平台的编译器标志(使用
add_definitions()
)。我可以成功地编译并链接源代码,从而生成适当的.so文件

但要在任何项目中使用该库,我也需要提供正确的头文件。CMake的以下
install
命令选择要复制的正确头文件,但不应用预处理器定义/包括的替换:

install(文件${headers}目标包括/mylibrary)

那么如何生成/安装“后编译”头文件呢

到目前为止我的想法是:

  • 由于
    add_definitions()
    应该在COMPILE_definitions变量中堆叠my-D,可能在复制的原始标题上运行
    foreach
    循环,并替换define/include占位符
  • 在复制之前,是否使用
    add_custom_command()
    应用一些逻辑
编辑:正如齐瓦雷夫所指出的,有一个答案非常接近我的需要,但不幸的是,不完全符合。总之,答案给出了两个选项:

  • 在库的所有标头中包含一个特殊的“config”标头,并利用cmakedefine命令在此标头上调用
    configure\u file()
    。我不能使用这种方法,因为我不想更改库头
  • 创建一个特定于目标的.cmake文件,该文件帮助外部项目包括正确的标题以及所有必要的-D定义。我也不能使用这种方法,因为我的外部项目不使用cmake进行构建。另外,我希望创建一个尽可能容易包含的库
还有其他想法吗

edit2:我可能需要详细说明我的陈述,即CMake的
install
命令没有替换defines。以以下为例:

//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/目录中仍然有一个头文件,其中包含操作系统特定的头占位符。当然,这不能正确地包含在任何开发项目中。

井的可能重复,但在谈到已安装的标头时,您所说的“不应用预处理器定义/包括的替换”是什么意思?编译器级别上没有头和编译器定义的绑定;您应该通过命令行将编译定义传递给编译器,或者修改头文件。您的编辑是否意味着不接受对头文件的修改?如果是这样,您应该通过命令行强制用户传递其他定义。如果您不想使用CMake方式,可以创建
.pc
文件,该文件可通过
pkg config
实用程序使用。这种方法可以接受吗?我看不到你关于“交叉编译”(你使用这个标签)的具体问题。简单的“支持多种不同的平台”并不自动意味着交叉编译。@Tsyvarev,请参阅编辑2以获得澄清。从一开始就应该用这个例子,对此我很抱歉。我也删除了cc标签,因为我同意你的观点。关于修改:我不希望在使用CMake安装后修改任何标题,不。对于
pkg config
,情况也是如此。但是,如果没有独立的解决方案,我可能会这样做。
我不希望在使用CMake安装后修改任何标题,不。
-这澄清了一点。。。但事实上,这个例子帮助很大。你能接受吗?1.将
sampleheader.hpp.放在源代码树中类似头文件的
#include@OS_SPECIFIC_header@
,2。在配置过程中,使用
#include“emblinuxHeader.hpp”
将其转换为构建树中的
sampleheader.hpp
头文件。3.将该标题用于生成项目,然后单击4。使用
Install()
安装该标题?如果是这样,可以使用参考问题中描述的
configure_file
进行转换。