Saya telah menulis perpustakaan yang biasa saya kompilasi menggunakan Makefile yang ditulis sendiri, tetapi sekarang saya ingin beralih ke cmake. Pohon itu terlihat seperti ini (saya menghapus semua file yang tidak relevan):
.
├── include
│ ├── animation.h
│ ├── buffers.h
│ ├── ...
│ ├── vertex.h
│ └── world.h
└── src
├── animation.cpp
├── buffers.cpp
├── ...
├── vertex.cpp
└── world.cpp
Jadi apa yang saya coba lakukan hanyalah mengkompilasi sumber ke perpustakaan bersama dan kemudian menginstalnya dengan file header.
Sebagian besar contoh yang saya temukan dapat dikompilasi dengan beberapa perpustakaan bersama tetapi tidak pernah hanya perpustakaan bersama biasa. Akan sangat membantu jika seseorang bisa memberi tahu saya perpustakaan yang sangat sederhana yang menggunakan cmake, jadi saya bisa menggunakan ini sebagai contoh.
c++
compilation
cmake
shared-libraries
Florian M
sumber
sumber
Jawaban:
Selalu tentukan versi minimum yang diwajibkan
cmake
cmake_minimum_required(VERSION 3.9)
Anda harus mendeklarasikan sebuah proyek.
cmake
mengatakan itu wajib dan itu akan menentukan variabel yang nyamanPROJECT_NAME
,PROJECT_VERSION
danPROJECT_DESCRIPTION
(variabel terakhir ini memerlukan cmake 3.9):project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Deklarasikan target perpustakaan baru. Harap hindari penggunaan
file(GLOB ...)
. Fitur ini tidak memberikan penguasaan proses kompilasi. Jika Anda malas, hasil copy-paste darils -1 sources/*.cpp
:Set
VERSION
properti (opsional tetapi ini adalah praktik yang baik):Anda juga dapat mengatur
SOVERSION
ke sejumlah besarVERSION
. Jadilibmylib.so.1
akan menjadi symlink kelibmylib.so.1.0.0
.set_target_properties(mylib PROPERTIES SOVERSION 1)
Deklarasikan API publik perpustakaan Anda. API ini akan dipasang untuk aplikasi pihak ketiga. Ini adalah praktik yang baik untuk mengisolasinya di pohon proyek Anda (seperti menempatkan
include/
direktori itu ). Perhatikan bahwa, tajuk pribadi tidak boleh dipasang dan saya sangat menyarankan untuk menempatkannya dengan file sumber.Jika Anda bekerja dengan subdirektori, sangat tidak nyaman untuk menyertakan jalur relatif seperti
"../include/mylib.h"
. Jadi, teruskan direktori teratas di direktori yang disertakan:atau
Buat aturan instal untuk perpustakaan Anda. Saya menyarankan untuk menggunakan variabel yang
CMAKE_INSTALL_*DIR
ditentukan dalamGNUInstallDirs
:Dan nyatakan file untuk diinstal:
Anda juga dapat mengekspor
pkg-config
file. File ini memungkinkan aplikasi pihak ketiga untuk dengan mudah mengimpor perpustakaan Anda:pkg-config
PKG_CHECK_MODULES
pkg_check_modules
Buat file template bernama
mylib.pc.in
(lihat pc (5) halaman manual untuk informasi lebih lanjut):Di Anda
CMakeLists.txt
, tambahkan aturan untuk memperluas@
makro (@ONLY
minta cmake untuk tidak memperluas variabel formulir${VAR}
):Dan terakhir, instal file yang dihasilkan:
Anda juga dapat menggunakan fitur cmake
EXPORT
. Namun, fitur ini hanya kompatibelcmake
dan menurut saya sulit untuk digunakan.Akhirnya keseluruhannya
CMakeLists.txt
akan terlihat seperti:cmake_minimum_required(VERSION 3.9) project(mylib VERSION 1.0.1 DESCRIPTION "mylib description") include(GNUInstallDirs) add_library(mylib SHARED src/mylib.c) set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 PUBLIC_HEADER api/mylib.h) configure_file(mylib.pc.in mylib.pc @ONLY) target_include_directories(mylib PRIVATE .) install(TARGETS mylib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
sumber
mkdir build && cd build/ && cmake .. && sudo make install
(atausudo make install/strip
menginstal versi perpustakaan bergaris )..pc
file, tambahkanRequires: liblog4cxx
kemylib.pc
, lain, Anda dapat menambahkan-llog4cxx
keLibs:
.CMakeLists.txt
File minimal ini mengumpulkan pustaka bersama sederhana:cmake_minimum_required(VERSION 2.8) project (test) set(CMAKE_BUILD_TYPE Release) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) add_library(test SHARED src/test.cpp)
Namun, saya tidak memiliki pengalaman menyalin file ke tujuan lain dengan CMake. Perintah file dengan tanda tangan COPY / INSTALL sepertinya berguna.
sumber
${CMAKE_CURRENT_SOURCE_DIR}/
dalaminclude_directories
berguna?Saya mencoba mempelajari cara melakukan ini sendiri, dan tampaknya Anda dapat menginstal library seperti ini:
sumber
Pertama, ini adalah tata letak direktori yang saya gunakan:
Setelah beberapa hari melihat ini, inilah cara favorit saya untuk melakukan ini berkat CMake modern:
cmake_minimum_required(VERSION 3.5) project(mylib VERSION 1.0.0 LANGUAGES CXX) set(DEFAULT_BUILD_TYPE "Release") if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() include(GNUInstallDirs) set(SOURCE_FILES src/class1.cpp src/class2.cpp) add_library(${PROJECT_NAME} ...) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> PRIVATE src) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1) install(TARGETS ${PROJECT_NAME} EXPORT MyLibConfig ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) install(EXPORT MyLibConfig DESTINATION share/MyLib/cmake) export(TARGETS ${PROJECT_NAME} FILE MyLibConfig.cmake)
Setelah menjalankan CMake dan menginstal pustaka, tidak perlu lagi menggunakan Find ***. File cmake, dapat digunakan seperti ini:
find_package(MyLib REQUIRED) #No need to perform include_directories(...) target_link_libraries(${TARGET} mylib)
Itu saja, jika sudah diinstal di direktori standar, itu akan ditemukan dan tidak perlu melakukan apa pun. Jika sudah diinstal di jalur non-standar, itu juga mudah, cukup beri tahu CMake di mana menemukan MyLibConfig.cmake menggunakan:
Saya harap ini membantu semua orang sebanyak itu telah membantu saya. Cara lama untuk melakukan ini cukup rumit.
sumber