2013-06-07 17 views
6

Próbuję użyć modułu GenerateExportHeader z cmake.cmake i GenerateExportHeader

częścią mojego CMakeLists.txt:

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

działa miły dla projektu gui sama, ale gdy próbuję to .h plików GUI w innym projekcie, #include „gui_export.h” nie może być odnaleźć. Jest to oczywiste, ponieważ gui_export.h został utworzony w katalogu budowania GUI, który nie znajduje się w ścieżce innych projektów.

Prostym rozwiązaniem byłoby dodać GUI do budowy reż inny projekt obejmuje jednak: 1. Nie uważam go jako koszerne rozwiązanie 2. Nie mogłem faktycznie nawet znaleźć sposobu, aby dowiedzieć się, co jest kompilacja Kierunek docelowy

Jak mogę rozwiązać ten problem?

+0

hm, czy próbujesz nie targetować dwóch projektów/bibliotek dll, ale nadal używasz deklaracji nagłówkowych twoich plików GUI w różnych projektach? – Najzero

+0

Łączę je. Co to zmienia? –

Odpowiedz

5

z nowoczesną (czyli 2,8 0,11 lub później) CUpewnij, korzystny mechanizm jest:

target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports) 

Następnie podczas eksportowania() biblioteki (co należy zrobić) lub w inny sposób wykorzystywać je w kontekście, w którym właściwości interfejsu docelowego! są znane (np. w tym samym ogólnym projekcie CMake, który wydaje się być tym, co robisz), target_link_libraries (foo gui) również przejdzie do niezbędnego katalogu include.

Umieszczenie go w dobrze znanym katalogu jest nieco ortogonalne. W obu przypadkach zaleca się użycie target_include_directories, aby poinformować konsumentów, gdzie znaleźć nagłówki biblioteki.

-2

Użyj polecenia export(), aby umożliwić programowi CMake znalezienie drzewa kompilacji. Możesz zajrzeć do openobexu na Gitorious, żeby zobaczyć, jak powinien wyglądać plik config.cmake.

OTOH, nie należy używać wygenerowanego nagłówka eksportu w publicznym nagłówku ani go instalować.

+1

Twoja rada dotycząca nie publikowania nagłówka z eksportem brzmi interesująco, ale nie łapię tego pomysłu. Wyobraźmy sobie, że mam bibliotekę z pojedynczym plikiem cpp z klasą A. Kiedy kompiluję pod oknami, muszę powiedzieć, że ta klasa ma zostać wyeksportowana. O ile mi wiadomo, zwykle robi się to poprzez przygotowanie pliku .h z definicją klasy A z __declspec (dllexport). Z drugiej strony, gdy chcę użyć tej klasy gdzie indziej, powinienem użyć __declspec (dllimport). To właśnie robi generator_export_header. Jak to zrobić, nie publikując tego pliku eksportu? –

+0

To nie ma sensu. Nagłówki eksportu są * przeznaczone * do użycia przez konsumentów biblioteki, a także samą bibliotekę. – Matthew

+2

Nagłówek musi zostać wyeksportowany. Ich nie da się obejść. W twoim celu instalacji, kopiujesz go i jest on dołączony do twoich innych nagłówków. – Atifm

4

mam rozwiązać ten problem za pomocą EXPORT_FILE_NAME, więc teraz mam:

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

i we wszystkich projektach dodam $ {CMAKE_BINARY_DIR}/eksport/do obejmuje