CMake7-install部署项目6:install Exports【用于find_package导入库】

在这里插入图片描述

一、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}")



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值