一、find_package
二、install export
install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]
[CXX_MODULES_DIRECTORY <directory>]
[EXPORT_LINK_INTERFACE_LIBRARIES]
[COMPONENT <component>]
[EXCLUDE_FROM_ALL])
install(EXPORT_ANDROID_MK <export-name> DESTINATION <dir> [...])
# 支持find_package
# 生成并安装配置文件 xlogConfig.cmake
instaLl(EXPORT ${PROJECT_NAME} FILE ${PROJECT_NAME}Config.cmake
DESTINATION lib/config/${PROJECT_NAME}-${version}
)
三、代码
1、安装库【export_my_package】
# 506export_my_package/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(export_my_package)
# cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/home/xcj/xcpp
file(WRITE include/slib.h "void SLib();")
file(WRITE slib.cpp [=[
#include <iostream>
#include "slib.h"
void SLib()
{
std::cout<<"In SLib function!\n";
}
]=])
add_library(slib STATIC slib.cpp)
#需要导出头文件
set_target_properties(slib PROPERTIES PUBLIC_HEADER include/slib.h)
#[[
Target "slib" INTERFACE_INCLUDE_DIRECTORIES property contains path:
"/home/xcj/code/src/506export_my_package/include"
which is prefixed in the source directory.
]]
#target_include_directories(slib PUBLIC include)
# 路径被两次引用 1 编译slib库时 2 install export写入config时
target_include_directories(slib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> #install时为空,只有编译时有值
$<INSTALL_INTERFACE:include> #只有install时有值 /home/xcj/xcpp/include
)
# -- Installing: /home/xcj/xcpp/lib/libslib.a
install(TARGETS slib
EXPORT slib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
PUBLIC_HEADER DESTINATION include
)
# <PackageName>Config.cmake
# slibConfig.cmake 写入库路径 头文件路径
# /home/xcj/xcpp/lib/config
install(EXPORT slib FILE slibConfig.cmake DESTINATION config)
2、find_package
# 507find_package/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(findpkg)
file(WRITE main.cpp [=[
#include "slib.h"
#include <iostream>
using namespace std;
int main()
{
cout<<"In Main"<<endl;
SLib();
return 0;
}
]=])
# cmake -S . -B build -DCMAKE_PREFIX_PATH=/home/xcj/xcpp/config
find_package(slib)
message("slib_FOUND = ${slib_FOUND}")
if(slib_FOUND)
message("find slib success!")
endif()
add_executable(main main.cpp)
target_link_libraries(main slib)
# 头文件路径写在属性中
get_target_property(inc slib INTERFACE_INCLUDE_DIRECTORIES)
message("INTERFACE_INCLUDE_DIRECTORIES = ${inc}")
四、多版本代码
main.cpp
#include "slib.h"
#include <iostream>
using namespace std;
int main()
{
cout<<"In Main"<<endl;
SLib();
return 0;
}
# 506export_my_package/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(export_my_package)
# cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/home/xcj/xcpp -Dversion1.1
if(NOT version)
set(version 1.0)
endif()
file(WRITE include/slib.h "void SLib();")
file(WRITE slib.cpp.in [=[
#include <iostream>
#include "slib.h"
void SLib()
{
std::cout<<"${version} In SLib function!\n";
}
]=])
# 替换文件中的变量
configure_file("slib.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/slib.cpp")
add_library(slib STATIC slib.cpp)
#需要导出头文件
set_target_properties(slib PROPERTIES PUBLIC_HEADER include/slib.h)
#[[
Target "slib" INTERFACE_INCLUDE_DIRECTORIES property contains path:
"/home/xcj/code/src/506export_my_package/include"
which is prefixed in the source directory.
]]
#target_include_directories(slib PUBLIC include)
# 路径被两次引用 1 编译slib库时 2 install export写入config时
target_include_directories(slib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> #install时为空,只有编译时有值
$<INSTALL_INTERFACE:${version}/include> #只有install时有值 /home/xcj/xcpp/include
)
# -- Installing: /home/xcj/xcpp/lib/libslib.a
install(TARGETS slib
EXPORT slib
RUNTIME DESTINATION ${version}/bin
LIBRARY DESTINATION ${version}/lib
ARCHIVE DESTINATION ${version}/lib
PUBLIC_HEADER DESTINATION ${version}/include
)
# <PackageName>Config.cmake
# slibConfig.cmake 写入库路径 头文件路径
# /home/xcj/xcpp/lib/config
# /home/xcj/xcpp/lib/config/slib-1.3/slibConfig.cmake
install(EXPORT slib FILE slibConfig.cmake DESTINATION config/slib-${version}/)
# 写入版本号信息 slibConfigVersion.cmake
# home/xcj/xcpp/lib/config
#
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_INSTALL_PREFIX}/config/slib-${version}/slibConfigVersion.cmake
VERSION ${version}
COMPATIBILITY SameMajorVersion # 版本兼容问题 cmake.org.cn
)
# 507find_package/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(findpkg)
file(WRITE main.cpp [=[
#include "slib.h"
#include <iostream>
using namespace std;
int main()
{
cout<<"In Main"<<endl;
SLib();
return 0;
}
]=])
# cmake -S . -B build -DCMAKE_PREFIX_PATH=/home/xcj/xcpp/config
if(NOT version)
set(version 1.0)
endif()
message("find_package ${version}")
# cmake -S . -B build -DCMAKE_PREFIX_PATH=/home/xcj/xcpp/config -Dversion=1.2
find_package(slib ${version})
message("slib_FOUND = ${slib_FOUND}")
if(slib_FOUND)
message("find slib success!")
endif()
add_executable(main main.cpp)
target_link_libraries(main slib)
# 头文件路径写在属性中
get_target_property(inc slib INTERFACE_INCLUDE_DIRECTORIES)
message("INTERFACE_INCLUDE_DIRECTORIES = ${inc}")