Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cmake and GenerateExportHeader

Tags:

c++

build

cmake

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?

like image 597
Michał Walenciak Avatar asked Jun 07 '13 10:06

Michał Walenciak


2 Answers

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.

like image 106
Matthew Avatar answered Nov 09 '22 13:11

Matthew


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

like image 33
Michał Walenciak Avatar answered Nov 09 '22 12:11

Michał Walenciak