Luôn thể chỉ định phiên bản yêu cầu tối thiểu của cmake
cmake_minimum_required(VERSION 3.9)
Bạn nên tuyên bố một dự án. cmake
nói nó là bắt buộc và nó sẽ xác định các biến thuận tiện PROJECT_NAME
, PROJECT_VERSION
và PROJECT_DESCRIPTION
(biến thứ hai này đòi hỏi cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Khai báo một đối tượng thư viện mới. Vui lòng tránh sử dụng file(GLOB ...)
. Tính năng này không cung cấp quy trình biên dịch đã được tham dự. Nếu bạn là lười biếng, sao chép-dán đầu ra của ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Đặt VERSION
bất động sản (không bắt buộc nhưng nó là một thực hành tốt):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Bạn cũng có thể thiết lập SOVERSION
đến số chính của VERSION
. Vì vậy, libmylib.so.1
sẽ là một liên kết tượng trưng đến libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Khai báo API công khai của thư viện của bạn. API này sẽ được cài đặt cho ứng dụng của bên thứ ba. Thực hành tốt là cô lập nó trong cây dự án của bạn (như đặt nó vào thư mục include/
). Lưu ý rằng, các tiêu đề riêng tư không được cài đặt và tôi khuyên bạn nên đặt chúng với các tệp nguồn.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Nếu bạn làm việc với thư mục con, sẽ không thuận tiện khi đưa đường dẫn tương đối như "../include/mylib.h"
.Vì vậy, vượt qua mục hàng đầu trong danh bạ bao gồm:
target_include_directories(mylib PRIVATE .)
hoặc
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Tạo cài đặt quy tắc cho thư viện của bạn. Tôi đề nghị sử dụng các biến CMAKE_INSTALL_*DIR
quy định tại GNUInstallDirs
:
include(GNUInstallDirs)
Và tuyên bố các file cài đặt:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Bạn cũng có thể xuất khẩu một tập tin pkg-config
. file này cho phép ứng dụng của bên thứ ba để dễ dàng nhập thư viện của bạn:
Tạo một tập tin mẫu có tên mylib.pc.in
:
[email protected][email protected]
[email protected][email protected]
libdir=${exec_prefix}/@[email protected]
includedir=${prefix}/@[email protected]
Name: @[email protected]
Description: @[email protected]
Version: @[email protected]
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
Trong CMakeLists.txt
của bạn, thêm một quy tắc để mở rộng @
macro (@ONLY
yêu cầu cmake để không mở rộng biến dạng ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Và cuối cùng, cài đặt tập tin được tạo:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Bạn có thể cũng sử dụng cmake EXPORT
feature. Tuy nhiên, tính năng này chỉ tương thích với cmake
và tôi thấy khó sử dụng.
Cuối cùng toàn bộ CMakeLists.txt
nên trông giống như:
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)
liên quan http://stackoverflow.com/questions/2152077/is-it-possible-to-get-cmake-to-build-both-a -Mã-và-chia-phiên bản-of-the-sam –