cmake and GenerateExportHeader

2019-04-06 15:57发布

问题:

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?

回答1:

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.



回答2:

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



回答3:

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.



标签: c++ build cmake