在标头文件

时间:2018-05-29 06:39:31

标签: c++ makefile cmake

我(交叉)编译共享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,但遗憾的是并不是这样。总之,答案提供了两个选项:

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

还有其他想法吗?

编辑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占位符。当然,这不能适当地包含在任何开发项目中。

0 个答案:

没有答案