CMakeLists.txt配置知识

静态库与动态库特点比较:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值