12

我正在尝试使用 cmake 中的 GenerateExportHeader 模块。

我的 CmakeLists.txt 的一部分:

add_compiler_export_flags()
add_library(gui SHARED ${gui_CPP} ${gui_HPP})
generate_export_header(gui)

它适用于 gui 项目本身,但是当我尝试在另一个项目中包含 gui 的 .h 文件时,找不到 #include "gui_export.h"。这很明显,因为 gui_export.h 是在 gui 的构建目录中创建的,它不在其他项目的包含路径中。

简单的解决方案是将gui的构建目录添加到其他项目的包含但是:1.我不认为它是一个犹太解决方案2.我实际上什至找不到如何找出目标的构建目录是什么

我怎样才能很好地解决这个问题?

4

3 回答 3

9

对于现代(即 2.8.11 或更高版本)CMake,首选机制是:

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports)

然后,当您 export() 您的库(您应该这样做!)或以其他方式在目标接口属性已知的上下文中使用它时(例如,在同一个整体 CMake 项目中,这似乎是您正在做的事情),target_link_libraries( foo gui) 也会选择必要的包含目录。

把它放在一个众所周知的目录中有点正交。无论哪种情况,建议使用 target_include_directories 告诉消费者在哪里可以找到您的库的标题。

于 2015-01-12T17:43:19.097 回答
7

我已经通过使用 EXPORT_FILE_NAME 解决了这个问题,所以现在我有:

generate_export_header(gui EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exports/gui_export.h)

在所有项目中,我将 ${CMAKE_BINARY_DIR}/exports/ 添加到包括

于 2013-06-20T07:52:44.350 回答
-3

使用 export() 允许 CMake 找到您的构建树。您可以在 gitorious 上查看 openobex,了解 config.cmake 文件的外观。

OTOH,您不应在公共标头中使用生成的导出标头或安装它。

于 2013-06-15T13:23:22.020 回答