静态库与动态库特点比较:
cmake工程目录基本构成:
bin----用于存放编译后的可执行文件
(如果可执行文件移动了位置,先使用以下命令设置依赖库的目录,在运行可执行文件)
$ export LD_LIBRARY_PATH=/libdir:LIBRARY_PATH
$ ./xxxxx
或者使用脚本setup.sh
build----用于存放编缓存文件,如果不指定bin目录,一般可执行文件也将产生于该目录
include----用于存放头文件
lib----用于存放库文件,.so为动态库文件.o为静态库文件
(动态库在可执行文件在运行时需指定库文件环境变量,静态库一般在编译时已经包含进可执行文件中,cmake编译时均需要提供头文件与lib路径)
src----用于存放源文件
CMakeLists.txt--cmake编译配置文件,内部详解:
----------------------------------------------------------------
cmake_minimum_required(VERSION 3.5) # 指定CMake的最小~最大版本
project("Test_Demo") # 设置项目名
set(CMAKE_BUILD_TYPE Debug|Release) # 要不要附带Debug信息进行编译
set(CMAKE_C_COMPILER"/usr/bin/clang|clang++") # 设置C编译器clang, 没安装clang可以不写
set(CMAKE_CXX_STANDARD 14) # 设置C++的版本
set(CMAKE_CXX_STANDARD_REQUIRED True) # 常与上一条命令搭配, 检查编译器是否符合要求
# 设置lib库的编译输出路径(PROJECT_SOURCE_DIR指工程顶级目录)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 设置可执行文件的编译输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设置变量 PROJECT_NAME 并初始化, 使用 ${XXX} 引用, 如: ${PROJECT_NAME}
set(PROJECT_NAME "xxx")
add_subdirectory(src) # 添加子目录src文件下的CMakeLists.txt作为配置文件一起组合编译
# 将xxxx.c源文件打包成名叫x的动|静态库,库名:libxx.so|libxx.a
add_library(xx SHARED|STATIC xxxx.c)
#设置链接时库搜索路径,与add_library(生成)、target_link_libraries(引用)相呼应
link_directories(./lib)
# 添加当#添加子目录, 子目录必须要有CMakeLists.txt文件,将./src目录含至"SRC_LIST"的临时(路径)变量中,SRC_LIST可任意取名
aux_source_directory(./src SRC_LIST)
include_directories(./include) # 加入头文件目录
include_directories(./src) #加入源文件目录
add_executable(Test_Demo ${SRC_LIST}) # 将SRC_LIST中的所有源文件打包成可执行文件
add_executable(Test_Demo ./main.c) # 将main.c单独打包成可执行文件
# 指定可执行文件Test_Demo可执行文件的链接库为libAAAA.so与libBBBB.so
target_link_libraries(Test_Demo AAAA BBBB)
# 设置库文件属性(文件路径,头文件目录),精确设置的依赖库和头文件的位置
set_target_properties(sqlite3 PROPERTIES
IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/libsqlite3.so"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
)
IMPORTED_LOCATION:导入位置
INTERFACE_INCLUDE_DIRECTORIES:接口包含目录
find_package # 查询库的位置,示例1,自动搜索;示例2,指定位置
示例1:
find_package(CURL)
add_executable(curltest curltest.cc)
if(CURL_FOUND)
target_include_directories(clib PRIVATE ${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR ”CURL library not found”)
endif(CURL_FOUND)
示例2:
set(FASTCDRPATH /usr/local/idds_dependence/lib/cmake/fastcdr)
find_package(fastcdr REQUIRED PATHS ${FASTCDRPATH})
target_link_libraries中的PUBLIC/PRIVATEINTERFACE属性:
PUBLIC 在public后面的库会被Link到你的target中,并且里面的符号也会被导出,提供给第三方使用。
PRIVATE 在private后面的库仅被link到你的target中,并且终结掉,第三方不能感知你调了啥库
INTERFACE 在interface后面引入的库不会被链接到你的target中,只会导出符号。
分模块编译例子:
参考链接
https://www.cnblogs.com/standardzero/p/10793746.html