一. 简介
前面文章学习了针对单个 .c文件,cmake 工具是如何编译的?
针对包含多个 .c文件,cmake工具又是如何编译的?文章如下:
cmake的使用方法: 单个源文件的编译-CSDN博客
cmake的使用方法: 多个源文件的编译-CSDN博客
本文来学习,cmake工具如何编译成静态库或动态库文件?
二. cmake的使用方法: 生成库文件
如果需要将 hello.c 编译为静态库文件或者动态库文件。则 CMakeLists.txt 文件需要进行修改,
CMakeLists.txt
文件修改后内容
如下:
project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)
进入到
build
目录下,执行
cmake
、再执行
make
编译工程,编译完成之后,在
build
目录下就会生成可执行文件
hello
和库文件,即在该工程根目录下,依次输入如下命令:
cd build/
cmake ../
make
在
build
目录下就会生成可执行文件
hello
和库文件,如下所示:
CMakeLists.txt 文件解释
本例中我们使用到了
add_library
命令和
target_link_libraries
命令。
add_library 命令用于生成库文件,在本例中我们传入了两个参数,第一个参数表示库文件的名字,需要注意的是,这个名字是不包含前缀和后缀的名字;
注意:在 Linux 系统中,库文件的前缀是 lib,动态库文件的后缀是.so,而静态库文件的后缀是.a;所以,意味着最终生成的库文件对应的名字会自动添加上前缀和后缀。
第二个参数表示库文件对应的源文件。
add_library 命令生成了一个静态库文件 liblibhello.a,如果要生成动态库文件,可以这样做:
add_library(libhello SHARED hello.c) #生成动态库文件
add_library(libhello STATIC hello.c) #生成静态库文件
target_link_libraries
命令为目标指定依赖库,在本例中
hello.c
被编译为库文件,并将其链接进
hello
程
序。
三. 更改生成的库文件名字
本例中有一点非常不爽,生成的库为
liblibhello.a
,名字非常不好看;如果想生成
libhello.a
该怎么办?
直接修改
add_library
命令的参数,像下面这样可以吗?
答案是不行的,因为
hello
这个目标已经存在了(
add_executable(hello main.c)),目标名对于整个工程来说是唯一的,不可出现相同名字的目标,所以这种方法肯定是不行的,
实际上我们只需要在
CMakeLists.txt
文件中添加下面这条命令即可:
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
set_target_properties
用于设置目标的属性,这里通过
set_target_properties
命令对
libhello
目标的OUTPUT_NAME
属性进行了设置,将其设置为
hello
。
CMakeLists.txt 文件经过更改后,内容如下:
cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello SHARED hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
add_executable(hello main.c)
target_link_libraries(hello libhello)
可以看出,除了添加 set_target_properties 命令之外,我们还加入了 cmake_minimum_required 命令,该命令用于设置当前工程的 cmake 最低版本号要求,当然这个并不是强制性的,但是最好还是加上。
进入到
build
目录下,使用
cmake+make
编译整个工程:
cd build/
cmake ../
make
编译完成之后会发现,生成的库文件为
libhello.a: