Sziasztok,
Lenne egy c++ projectem amit cmakekel buildelnék, benne több alproject.
Ebből az egyik egy lib, amit más alprojectek használnak.
A lib létrehozásához az add_library és az INSTALL(TARGETS ...)-t kell használnom, ott ahol pedig szükségem van a lib re a
link_directories(${PROJECT_BINARY_DIR}/lib) és
target_link_libraries(...) -t.
Ezzel nincs is probléma, a .so file létrejön a megadott helyen, de szükségem lenne arra, hogy a .hh fájlok is látszódjanak, azonban az install(FILES ...) mintha nem csinálna semmit.
Ennek szemléltetésére létrehoztam egy új projectet QtCreatorban:
& ls test
CMakeLists.txt empty.hh main.cpp
$ cat test/CMakeLists.txt
project(test)
cmake_minimum_required(VERSION 2.8)
install(FILES empty.hh DESTINATION include)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
$ cat test/main.cpp
#include
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
$ cat test/empty.hh
#ifndef EMPTY_HH
#define EMPTY_HH
#endif // EMPTY_HH
Ha a fájlok a "test" könyvtárban vannak, akkor a qtcreator alapértelmezetten a "test-build"-be fordít.
$ ls test-build/
CMakeCache.txt CMakeFiles Makefile cmake_install.cmake test test.cbp
$ ./test-build/test
Hello World!
Mint látható az empty.hh nincs a test-build/include alatt.
Google szerint így kéne használni az install(FILES...)-t, de nekem nem megy, lehet valamit félrenézek.
Ötleteket előre is köszi.
ui.:
$ cmake --help
cmake version 2.8.12
Hozzászólások
A fenti peldaban nem a build konyvtar van megadva, mint cel, hanem a rendszered alapertelmezett include konyvtara, pl. /usr/local/include. Ha a build konyvtarba akarod pakolni az empty.hh-t, akkor azt kozolnod is kell, pl. igy:
install(FILES empty.hh DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
Köszönöm válaszod,
sajnos ez így sem jó.
Letöröltem a build könyvtárat, átírtam a a CMakeList.txt, most így néz ki:
project(test)
cmake_minimum_required(VERSION 2.8)
install(FILES empty.hh DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
Ezután újra futtatva a cmake-et az alábbi fájlokat kapom:
$ ls test-build/
CMakeCache.txt CMakeFiles Makefile cmake_install.cmake test test.cbp
Próbáltam a cmake-et nem csak az IDEből, hanem a konzolból is meghívni, az eredmény ua.
attol hogy a cmake-et meghivod, nem fog vegrehajtodni az "install" parancs, ahhoz make install kell
es a CMAKE_CURRENT_BINARY_DIR helyett hasznald a CMAKE_BINARY_DIR-t, ha magaba a build konyvtarba akarod rakni (es nem az ala valami melyen elrejtett subdirbe)
Kipróbáltam a test projecten és működik, köszönöm!
Viszont azt nem értem, hogy az eredeti példában az INSTALL(TARGETS ...) a megfelelő helyre hozza létre a .so-t a sima make parancs install nélkül.
Azt szeretném - ha lehet ilyet -, hogy a fő projectnél létrehozom a makefileokat a cmake paranccsal, majd a make-el fordítok. Jelenleg így csak a .so jön létre, de a headerek nem másolódnak a megfelelő helyre, azaz a következő alprojectnél fordítási hiba lesz, mert nem találja a .hh-t.
Ezt úgy tudnám megoldani, hogy a lib alprojectnél make majd make install, aztán a többi alprojectnél már mehet a make.
De ezt egy lépésben nem lehet megoldani?
de miert masolod a headert? masolgatas helyett meg kell adni include_directories()-zal hogy melyik konyvtarban van, es meg fogja talalni
ha mindenaron masolni akarsz, akkor hasznald a file(COPY)-t
Ez a file(COPY) jónak tűnik. Köszönöm!