cmake and GenerateExportHeader

2019-04-06 15:08发布

I'm trying to use GenerateExportHeader module from cmake.

part of my CmakeLists.txt:

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

it works nice for gui project itself, but when I try to include gui's .h files in another project, an #include "gui_export.h" cannot be find. This is obvious as gui_export.h was created in gui's build dir which is not in include path of other projects.

The simple solution would be to add gui's build dir to other project's includes but: 1. I don't find it as a kosher solution 2. I could not actually even find how to find out what is the build dir of a target

how can I solve this problem well?

标签: c++ build cmake
3条回答
该账号已被封号
2楼-- · 2019-04-06 15:49

With modern (i.e. 2.8.11 or later) CMake, the preferred mechanism is:

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports)

Then when you export() your library (which you should do!) or otherwise use it in a context where the target interface properties are known (e.g. in the same overall CMake project, which seems to be what you are doing), target_link_libraries(foo gui) will also pick up the necessary include directory.

Putting it in a well known directory is somewhat orthogonal. In either case, it is recommended to use target_include_directories to tell consumers where to find your library's headers.

查看更多
\"骚年 ilove
3楼-- · 2019-04-06 15:52

I've solved this problem by using EXPORT_FILE_NAME, so now I have:

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

and in all projects I add ${CMAKE_BINARY_DIR}/exports/ to includes

查看更多
萌系小妹纸
4楼-- · 2019-04-06 16:05

Use export() to allow CMake to find your build tree. You can take a look at openobex on gitorious to see how the config.cmake file has to look like.

OTOH, you should not use that generated export header in your public header or install it.

查看更多
登录 后发表回答