app调用lib
之前我们学到了如何书写一个可执行程序和Library,现在我们使用target_link_libraries
把lib和app结合起来。
项目结构为:
- main.cpp
- lib.cpp
- CMakeLists.txt
# app cmake_minimum_required(VERSION 3.0.0) set(app "demo") project(${app} VERSION 0.1.0) add_executable(${app} main.cpp) # lib set(lib "my-lib") project(${lib}) add_library(${lib} ./lib.cpp) # 将lib链接到app target_link_libraries(${app} ${lib}) 复制代码
需要注意的target_link_libraries
- 第一个参数来自
add_executable
的第一个参数 - 第二个参数来自
add_library
的第一个参数
项目结构优化
一般来说,lib和app是分离的,要引入lib的CMakeLists.txt,可以这么做:
- 方式1
include(lib/CMakeLists.txt) 复制代码
- 方式2
add_subdirectory(./lib ) 复制代码
注意:如果lib目录不是app目录的子目录,必须指定第二个参数,也就是bin目录
两种方式的异同:
相同点:
- 在上层的CMakeLists.txt中可以直接使用其中的变量。
区别:
include
的scope还是上层的CMakeLists.txtadd_subdirectory
的scope是当前CMakeLists.txt
也就是CMAKE_CURRENT_SOURCE_DIR
发生了改变
include头文件目录问题
动态添加lib的CMakeLists.txt后,我们需要为app添加头文件目录
- 方式1:在app的CMakeLists.txt中添加
include_directories("a/b/c/") 复制代码
- 方式2:在lib项目中添加,只要有app使用到了这个lib,就会自动将这个目录添加到app的项目中
# 注意:要放在add_library后边 target_include_directories(${LIB_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/) 复制代码
推荐使用第2种方式。
lib包含目录问题
如果项目中使用的预编译好的库文件,可以使用link_directories
和target_link_directories
,区别参考上文。