CMake手动编译生成动静态库并链接

 参考内容

https://blog.youkuaiyun.com/iuu77/article/details/129229361icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/iuu77/article/details/129229361

备忘:

${PROJECT_BINARY_DIR}指构建时的目录

../指上级目录

./指当前目录

对于如下结构的文件夹(假设inc内有头文件)

准备好所有cpp及对应头文件,创建CMakeLists.txt放在build目录下,编辑CMakeLists.txt

生成动态与静态库

如以下,第一行是编译所需最低版本,第二行是构建项目的名称

对于同一目录下的多个源文件,可用aux_source_directory制定该目录下所有文件到一个自定义的变量中,${PROJECT_BINARY_DIR}/../src指构建时的目录(build)的上级目录下的src文件夹,其下所有源文件都传递给变量SRC_LIST,后续使用${SRC_LIST}即可指代已整合的源文件

若头文件在其他路径下,可用include_directories自动查找头文件,输入参数为头文件所在文件夹路径,这里为${PROJECT_BINARY_DIR}/../inc

无论生成动态库还是静态库,都使用add_library实现,使用方法输入三个参数:库名称 动态or静态关键字 生成库所需源文件,关键字为SHARED与STATIC,分别对应动态.so文件与静态.a文件

设置最终生成库的名称可用set_target_properties,第一个参数为库名称,最后一个参数为新名称,一般会统一,方便最后链接到可执行文件

最后设置库默认生成的路径,可以指定库文件生成到你想要的位置,比如${PROJECT_BINARY_DIR}/../lib内

cmake_minimum_required (VERSION 2.8)
project (learn_cmake)
 
#整合目录内所有源文件至一变量   路径  源文件指代变量   ${PROJECT_BINARY_DIR}指cmake所在文件夹路径build
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST) 

#添加头文件
include_directories(${PROJECT_BINARY_DIR}/../inc)

#添加动态静态库  生成库名称  动态or静态  生成所需源文件(变量指代)
add_library(hello_shared SHARED ${SRC_LIST})
add_library(hello_static STATIC ${SRC_LIST})

#设置最终生成库名称  一般统一动静态库 
set_target_properties(hello_shared PROPERTIES OUTPUT_NAME "hello_lib")
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello_lib")
 
#设置库默认生成位置路径  关键字  路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

随后保存退出,在build目录下执行

cmake .
make

此时会发现,在lib目录下,出现了.a与.so库文件

链接库文件至可执行文件

删除或注释刚才CMakeLists.txt的所有内容,按以下内容重新编辑

前四行和刚才一样

第五行使用find_library查找库文件并传递给一变量,这里设置变量名为HELLO_LIB方便后续引用,寻找库文件名称为hello_lib(之前统一了动静态库名称),库文件所在目录是${PROJECT_BINARY_DIR}/../lib

稍后会生成二进制的可执行文件,在生成之前可以先指定其生成位置,这里选择放在bin文件夹下,即${PROJECT_BINARY_DIR}/../bin

现在使用add_executable生成可执行文件,参数:最终生成的可执行文件名称 所有源代码(用先前定义的源码变量指代)

使用target_link_libraries链接库到可执行文件,参数:已有可执行文件的名称 所有库文件(用先前定义的库文件变量指代)

cmake_minimum_required (VERSION 2.8)
project (learn_cmake)

aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST) 

include_directories(${PROJECT_BINARY_DIR}/../inc)

# 变量  查找库文件名称  库文件所在目录
find_library(HELLO_LIB hello_lib ${PROJECT_BINARY_DIR}/../lib)

#可执行文件生成路径  /build/../bin
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)

#生成可执行文件
add_executable(hello ${SRC_LIST})

#链接库到可执行文件
target_link_libraries(hello ${HELLO_LIB})

 随后保存退出,还是在build目录下执行

cmake .
make

此时会发现,在bin目录下,出现了hello可执行文件

运行可执行文件

./hello

将cpp源码移出工作文件夹后,程序依然可以运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值