Napisałem bibliotekę, którą skompilowałem przy użyciu samodzielnie napisanego pliku Makefile, ale teraz chcę przełączyć się na cmake. Drzewo wygląda tak (usunąłem wszystkie nieistotne pliki):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Więc to, co próbuję zrobić, to po prostu skompilować źródło do biblioteki współdzielonej, a następnie zainstalować je z plikami nagłówkowymi.
Większość przykładów, które znalazłem, kompiluje pliki wykonywalne z niektórymi bibliotekami współdzielonymi, ale nigdy nie jest to zwykła biblioteka współdzielona. Byłoby również pomocne, gdyby ktoś mógł mi po prostu powiedzieć bardzo prostą bibliotekę używającą cmake, więc mogę użyć tego jako przykładu.
c++
compilation
cmake
shared-libraries
Florian M
źródło
źródło
Odpowiedzi:
Zawsze określaj minimalną wymaganą wersję
cmake
Powinieneś zgłosić projekt.
cmake
mówi, że jest to obowiązkowe i zdefiniuje wygodne zmiennePROJECT_NAME
,PROJECT_VERSION
iPROJECT_DESCRIPTION
(ta ostatnia zmienna wymaga cmake 3.9):Zadeklaruj nowy cel biblioteki. Prosimy unikać używania
file(GLOB ...)
. Ta funkcja nie zapewnia biegłego opanowania procesu kompilacji. Jeśli jesteś leniwy, skopiuj i wklej wyjściels -1 sources/*.cpp
:Ustaw
VERSION
właściwość (opcjonalna, ale jest to dobra praktyka):Możesz również ustawić
SOVERSION
większą liczbę plikówVERSION
. Więclibmylib.so.1
będzie dowiązanie symboliczne dolibmylib.so.1.0.0
.Zadeklaruj publiczny interfejs API swojej biblioteki. Ten interfejs API zostanie zainstalowany dla aplikacji innej firmy. Dobrą praktyką jest odizolowanie go w drzewie projektu (np. Umieszczenie go w
include/
katalogu). Zauważ, że nagłówki prywatne nie powinny być instalowane i zdecydowanie sugeruję umieszczenie ich razem z plikami źródłowymi.Jeśli pracujesz z podkatalogami, dołączanie ścieżek względnych, takich jak
"../include/mylib.h"
. Więc przekaż główny katalog w dołączonych katalogach:lub
Utwórz regułę instalacji dla swojej biblioteki. Proponuję używać zmiennych
CMAKE_INSTALL_*DIR
zdefiniowanych wGNUInstallDirs
:I zadeklaruj pliki do zainstalowania:
Możesz także wyeksportować
pkg-config
plik. Ten plik umożliwia aplikacji innej firmy łatwe importowanie Twojej biblioteki:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Utwórz plik szablonu o nazwie
mylib.pc.in
(zobacz stronę podręcznika pc (5), aby uzyskać więcej informacji):W swoim
CMakeLists.txt
dodaj regułę rozwijania@
makr (@ONLY
poproś, aby cmake nie rozwijał zmiennych formularza${VAR}
):Na koniec zainstaluj wygenerowany plik:
Możesz także skorzystać z funkcji cmake
EXPORT
. Jednak ta funkcja jest kompatybilna tylko zcmake
i jest trudna w użyciu.Wreszcie całość
CMakeLists.txt
powinna wyglądać następująco:źródło
mkdir build && cd build/ && cmake .. && sudo make install
(lubsudo make install/strip
zainstalować wersję biblioteki w paski )..pc
plik, dodajRequires: liblog4cxx
do swojegomylib.pc
, w przeciwnym razie możesz po prostu dodać-llog4cxx
doLibs:
.Ten minimalny
CMakeLists.txt
plik kompiluje prostą bibliotekę współdzieloną:Jednak nie mam doświadczenia w kopiowaniu plików do innego miejsca docelowego za pomocą CMake. Polecenie file z podpisem COPY / INSTALL wygląda na przydatne.
źródło
${CMAKE_CURRENT_SOURCE_DIR}/
winclude_directories
jest przydatne?Próbuję się nauczyć, jak to zrobić, i wygląda na to, że możesz zainstalować bibliotekę w następujący sposób:
źródło
Po pierwsze, to jest układ katalogu, którego używam:
Po kilku dniach przyjrzenia się temu, oto mój ulubiony sposób robienia tego dzięki nowoczesnemu CMake:
Po uruchomieniu CMake i zainstalowaniu biblioteki nie ma potrzeby korzystania z plików Find ***. Cmake, można go używać w następujący sposób:
To wszystko, jeśli został zainstalowany w standardowym katalogu, zostanie znaleziony i nie ma potrzeby robić nic więcej. Jeśli został zainstalowany w niestandardowej ścieżce, jest to również łatwe, po prostu powiedz CMake, gdzie znaleźć MyLibConfig.cmake, używając:
Mam nadzieję, że pomogło to wszystkim tak samo, jak pomogło mi. Stare sposoby na to były dość uciążliwe.
źródło