Luôn chỉ định phiên bản bắt buộc tối thiểu của cmake
cmake_minimum_required(VERSION 3.9)
Bạn nên khai báo 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 đòi hỏi này sau cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Khai báo một mục tiêu thư viện mới. Xin vui lòng tránh sử dụng file(GLOB ...)
. Tính năng này không cung cấp quyền làm chủ của quá trình biên dịch. Nếu bạn 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 thuộc VERSION
tính (tùy chọn nhưng đó là một thực tiễn tốt):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Bạn cũng có thể thiết lập SOVERSION
một số lượng lớn VERSION
. Vì vậy, libmylib.so.1
sẽ là một liên kết đế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. Đó là một thực hành tốt để cô lập nó trong cây dự án của bạn (như đặt include/
thư mục của nó ). Lưu ý rằng, không nên cài đặt các tiêu đề riêng tư và tôi thực sự 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 các thư mục con, sẽ không thuận tiện khi bao gồm các đường dẫn tương đối như thế nào "../include/mylib.h"
. Vì vậy, vượt qua một thư mục hàng đầu trong các thư mục bao gồm:
target_include_directories(mylib PRIVATE .)
hoặc là
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Tạo một quy tắc cài đặt cho thư viện của bạn. Tôi đề nghị sử dụng các biến CMAKE_INSTALL_*DIR
được định nghĩa trong GNUInstallDirs
:
include(GNUInstallDirs)
Và khai báo các tập tin để 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 một pkg-config
tập tin. Tệp 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 mẫu có tên mylib.pc.in
(xem pc (5) manpage để biết thêm thông tin):
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
Trong của bạn CMakeLists.txt
, thêm quy tắc để mở rộng @
macro ( @ONLY
yêu cầu cmake để không mở rộng các biến của biểu mẫu ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Và cuối cùng, cài đặt tệp được tạo:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Bạn cũng có thể sử dụng tính năng cmakeEXPORT
. Tuy nhiên, tính năng này chỉ tương thích cmake
và tôi cảm thấy khó sử dụng.
Cuối cùng, toàn bộ CMakeLists.txt
sẽ trô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)