CMake教程5:可执行程序调用lib

简介: CMake教程5:可执行程序调用lib

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.txt
  • add_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_directoriestarget_link_directories,区别参考上文。



目录
相关文章
|
22天前
CMake基础(4)动态库
CMake基础(4)动态库
16 1
|
22天前
|
自然语言处理
CMake基础(3)静态库
CMake基础(3)静态库
28 1
|
2月前
|
C语言 Windows
使用CMake调用Makefile 项目
使用CMake调用Makefile 项目
27 0
|
Ubuntu
Ubuntu 18.04使用CMake编译可执行文件、动态链接库
Ubuntu 18.04使用CMake编译可执行文件、动态链接库
771 0
Ubuntu 18.04使用CMake编译可执行文件、动态链接库
|
Shell 编译器 Linux
zlib-1.2.11库、libpng-1.6.36库编译及交叉编译 —— 附带shell编译脚本及源码
zlib-1.2.11库、libpng-1.6.36库编译及交叉编译 —— 附带shell编译脚本及源码
348 0
zlib-1.2.11库、libpng-1.6.36库编译及交叉编译 —— 附带shell编译脚本及源码
|
C++
AndroidStudio中CMake多模块多目录编译
在学习过程接触到了CMake编译,它的好处就是可以跨平台。 使用AndroidStudio开发的工程中需要引入第三方库,加上自己的lib库,最后生成指定的SO库,这就涉及到了多模块编译。
440 0
|
IDE 开发工具
CMake教程3:最简单的CMake可执行程序
CMake教程3:最简单的CMake可执行程序
166 0
|
iOS开发
CMake教程7:安装与编译
CMake教程7:安装与编译
357 0
|
关系型数据库 MySQL Linux
编译tars的时候找不到libmysqlclient.a静态库
获取MariaDB源码 下载相应源码,下载地址mariadb-5.5.56.tar.gz 下载后传到虚拟机中,解压然后编译。
181 0
|
缓存
CMake实战二:多个源文件,同一或多个目录
CMake实战一只有单个源文件,现在把add函数写入myMath.cpp的源文件里面,声明放到myMath.h源文件里面
782 0