这里使用我自己构建的项目进行举例说明
- 项目框架介绍
项目名为bitcq_nvenc,下图为项目结构
其中include中包含了项目对外的头文件以及项目本身使用到的其他头文件,source中包含了cpp文件
- cmake文件介绍
下面是CMakeLists.txt文件,删去了多余部分只保留核心代码进行说明
cmake_minimum_required(VERSION 3.5) #指定cmake最低要求版本
set(CMAKE_CXX_STANDARD 17) #指定项目使用的C++版本
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fPIC -O3 -Wall -g") #附加选项 酌情添加
set(CMAKE_INSTALL_PREFIX /usr) #默认编译软件后的make install根路径
set(PROJECT_VERSION 0.0.1) #设置项目的版本号变量
project(bitcq_nvenc VERSION ${PROJECT_VERSION} LANGUAGES CXX) #这里用于设置待自动生成的项目版本很好
set(HEADERS ${CMAKE_SOURCE_DIR}/include/${PROJECT_NAME}.hpp) #设置待对外的项目头文件
add_library(${PROJECT_NAME} SHARED ${CMAKE_SOURCE_DIR}/source/${PROJECT_NAME}.cc) #这里生成核心项目的so文件 一般以lib***.so结尾 注意需使用SHARED生成动态库
if (BUILD_SHARED_LIBS) #这里编译给定的target时使用指定的编译定义
target_compile_definitions(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:BUILD_DLL> $<INSTALL_INTERFACE:USE_DLL>)
else()
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_LIB)
endif()
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/> #这里将项目引用的include文件夹包含进去 可以根据自己项目进行实际调整
$<INSTALL_INTERFACE:include/${PROJECT_NAME}/>
)
target_link_libraries(${PROJECT_NAME} PRIVATE
rt #链接自己项目依赖的库
)
set_target_properties(${PROJECT_NAME} PROPERTIES #这里开始就是设置安装相关参数了
SOVERSION ${PROJECT_VERSION}
PUBLIC_HEADER ${HEADERS}
)
install(TARGETS ${PROJECT_NAME} #这里export target暂存
EXPORT ${PROJECT_NAME}-targets
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include
)
# 安装install中export的项目安装内容到targets.cmake 暂存
install(EXPORT ${PROJECT_NAME}-targets
NAMESPACE ${PROJECT_NAME}::
FILE ${PROJECT_NAME}-targets.cmake
DESTINATION lib/cmake/${PROJECT_NAME}
)
#设置即将生成的cmake.in文件内使用到的环境变量
set(INCLUDE_INSTALL_DIR include/)
set(LIBRARY_INSTALL_DIR lib/)
# 生成一个cmake.in文件用于链接到targets.cmake
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/build/${PROJECT_NAME}-config.cmake.in [[
@PACKAGE_INIT@
# include(CMakeFindDependencyMacro)
# find_dependency(OtherLib REQUIRED) #这个设置可以给待使用项目自动链接其他需求库
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") #这里设置find_package之后需要查找的cmake文件
set_and_check(BITCQ_NVENC_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") #设置find_package后的include变量
set_and_check(BITCQ_NVENC_LIBRARY "@PACKAGE_LIBRARY_INSTALL_DIR@lib@PROJECT_NAME@.so") #设置find_package后的lib变量
check_required_components("@PROJECT_NAME@")
]])
# 创建cmake标准文件config.cmake
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
# 将cmake.in文件转化成config.cmake文件并安装到系统目录
configure_package_config_file(${CMAKE_CURRENT_BINARY_DIR}/build/${PROJECT_NAME}-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
INSTALL_DESTINATION ${LIBRARY_INSTALL_DIR}/cmake/${PROJECT_NAME}
PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR
#NO_SET_AND_CHECK_MACRO
#NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
# configure_file(${PROJECT_NAME}-config.cmake.in ${PROJECT_NAME}-config.cmake @ONLY)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
DESTINATION ${LIBRARY_INSTALL_DIR}/cmake/${PROJECT_NAME}
)
- 使用方式
从其他项目中使用该库
find_package(bitcq_nvenc REQUIRED)
add_executable(${YOUR_PROJECT_TARGET_NAME} ${YOUR_PROJECT_SOURCE_FILE} )
target_include_directories(${YOUR_PROJECT_TARGET_NAME} PRIVATE
${BITCQ_NVENC_INCLUDE_DIR}
)
target_link_libraries(${YOUR_PROJECT_TARGET_NAME} PRIVATE
${BITCQ_NVENC_LIBRARY}
)
- 如何打包项目为deb文件
项目本身可以通过make install方式安装 不过也可以打包为deb(仅debian系统下),下面介绍一下打包方式
在根目录下创建一个sh文件,运行下面代码即可创建deb包到根目录,需要注意的是control文件中package名不能使用下划线
#!/bin/bash -e
version=0.0.1
rm -rf build
mkdir build
cd build
mkdir -p bitcq_nvenc_${version}_arm64/DEBIAN
touch bitcq_nvenc_${version}_arm64/DEBIAN/control
mkdir bitcq_nvenc_${version}_arm64/usr
cmake -DCMAKE_INSTALL_PREFIX=./bitcq_nvenc_${version}_arm64/usr ..
make -j $(nproc) install
echo "Package: bitcq-nvenc
Version: ${version}
Architecture: arm64
Maintainer: 9426224 <9426224@live.com>
Description: A lib used to socket, powered by bitcq." > bitcq_nvenc_${version}_arm64/DEBIAN/control
dpkg-deb --build --root-owner-group bitcq_nvenc_${version}_arm64
mv bitcq_nvenc_${version}_arm64.deb ..
rm -rf ../build