C++ 头文件上的CMake/make apply-D标志
我正在(交叉)编译一个共享C库,它支持许多不同的平台,这些平台由CMakeLists文件的层次结构处理。在这些文件中,有条件地生成了几个特定于平台的编译器标志(使用C++ 头文件上的CMake/make apply-D标志,c++,makefile,cmake,C++,Makefile,Cmake,我正在(交叉)编译一个共享C库,它支持许多不同的平台,这些平台由CMakeLists文件的层次结构处理。在这些文件中,有条件地生成了几个特定于平台的编译器标志(使用add_definitions())。我可以成功地编译并链接源代码,从而生成适当的.so文件 但要在任何项目中使用该库,我也需要提供正确的头文件。CMake的以下install命令选择要复制的正确头文件,但不应用预处理器定义/包括的替换: install(文件${headers}目标包括/mylibrary) 那么如何生成/安装“后编
add_definitions()
)。我可以成功地编译并链接源代码,从而生成适当的.so文件
但要在任何项目中使用该库,我也需要提供正确的头文件。CMake的以下install
命令选择要复制的正确头文件,但不应用预处理器定义/包括的替换:
install(文件${headers}目标包括/mylibrary)
那么如何生成/安装“后编译”头文件呢
到目前为止我的想法是:
- 由于
应该在COMPILE_definitions变量中堆叠my-D,可能在复制的原始标题上运行add_definitions()
循环,并替换define/include占位符foreach
- 在复制之前,是否使用
应用一些逻辑add_custom_command()
- 在库的所有标头中包含一个特殊的“config”标头,并利用cmakedefine命令在此标头上调用
。我不能使用这种方法,因为我不想更改库头configure\u file()
- 创建一个特定于目标的.cmake文件,该文件帮助外部项目包括正确的标题以及所有必要的-D定义。我也不能使用这种方法,因为我的外部项目不使用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
进行转换。