个人博客 https://juejin.cn/user/176366088104638 和 http://blog.wuzhenyu.com.cn
cmake 编译动态库和链接动态库
cmake 中,通过 add_library
的方式,来设置编译目标,编译结果为动态库或者静态库
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
name 就是目标名,即 target_name
。目标名称,在 cmake 中是一个很特殊的存在,特殊在哪里呢,后面我一点点展开说明。
上面的参数中,STATIC 表示目标为静态库,而 SHARED 表示为动态库。
我们来看一个例子,例子很简单,就是实现一个 output 打印接口,编译成动态库 liboutput.so
,然后通过链接这个动态库的方式调用 output 方法,打印 Hello World 到屏幕上,我们来看一下目录结构
├── CMakeLists.txt
├── demo
│ ├── CMakeLists.txt
│ └── helloworld.cpp
├── output.cpp
├── output.h
根目录中的 CMakeLists.txt
文件为
project(test)
add_library(output SHARED output.cpp)
set(LIB_OUTPUT_DIR "${PROJECT_SOURCE_DIR}/dist")
set_target_properties(output
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${LIB_OUTPUT_DIR}
ARCHIVE_OUTPUT_DIRECTORY ${LIB_OUTPUT_DIR}
)
add_subdirectory(demo)
为了方便,我们通过 set_target_properties
将动态库编译后,存放到根目录下的 dist 文件夹中,${PROJECT_SOURCE_DIR}
这个变量所代表的目录,跟 project 有关,表示的是指定了 project 的目录作为源代码路径,也就是 ${PROJECT_SOURCE_DIR}
这个变量的值。
而 demo/CMakeLists.txt
为<