作为一个库的作者,我需要提供什么配置才能让消费者轻松地安装库.
CMakeLists.txt
cmake_minimum_required(VERSION 3.26)
project(mylib C)
set(CMAKE_C_STANDARD 11)
add_library(mylib src/foo.c src/bar.c)
target_compile_features(mylib PRIVATE c_std_11)
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
# Config
configure_package_config_file(build/config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake # cmake-build-debug/
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME} NO_SET_AND_CHECK_MACRO) # share/
# Version
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
VERSION 1.0.0
COMPATIBILITY SameMajorVersion)
# Install Config & Version
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake # cmake-build-debug/
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake # cmake_build-debug/
DESTINATION
${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) # share/
# Create export set to enable import in other CMake Projects
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-targets # create export set
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib/
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib/
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # include/
)
# Install Export Set
install(EXPORT ${PROJECT_NAME}-targets
NAMESPACE mylib::
DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
# Install Headers
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) # include/
我的config.cmake
@PACKAGE_INIT@
include(${CMAKE_CURRENT_LIST_DIR}/mylib-targets.cmake)
check_required_components(mylib)
请查看并建议需要更改配置或CMakeLists文件的内容,以获得无缝的消费者体验.
Edit Consumer
cmake_minimum_required(VERSION 3.26)
project(consumer C)
set(CMAKE_C_STANDARD 11)
add_executable(consumer main.c)
find_package(mylib CONFIG REQUIRED)
target_link_libraries(consumer PRIVATE mylib::mylib)
Directory structure
mylib/
|-- CMakeLists.txt (top-level)
|-- src/
| |-- CMakeLists.txt
| |-- foo.c
| |-- bar.c
|-- example/
| |-- CMakeLists.txt
| |-- example1.c
| |-- example2.c
Example/CMakeLists.txt
add_executable(example1 example1.c)
target_link_libraries(example1 PRIVATE mylib)
add_test(NAME TestExample1 COMMAND example1)
add_executable(example2 example2.c)
target_link_libraries(example2 PRIVATE mylib)
add_test(NAME TestExample2 COMMAND example2)