CMake配置工程链接库

CMake是一款优秀的C/C++项目构建工具。而C/C++项目经常使用一些第三方库,如boost、luajit等。而在CMake下大致有3种方式将C/C++库引入工程。

find_package
find_package是CMake原生使用的库查找命令。使用方式如下

find_package(Boost REQUIRED)
find_package(SDL2 REQUIRED)
if(Boost_FOUND) #这些变量的名称没有标准,去CMakeCache.txt里看产生什么变量。
message(STATUS "found boost")
endif()
include_directories(${Boost_INCLUDE_DIRS}) #这个类型变量肯定会有,头文件目录
target_link_libraries(CruleEngine "${SDL2_IMAGE_LIBRARY}") #这是库的位置 ?
1
2
3
4
5
6
7
这个查找主要是在unix下起作用,在windows下几乎没用。它是其实是通过一个.cmake的配置文件,来找到对应的库文件的位置。cmake本身内置了一些知名的库的.cmake配置文件,如boost。
具体支持哪些,可以通过

cmake --help-module-list
1
或者在下面的网址查看详细信息
https://cmake.org/cmake/help/v3.0/manual/cmake-modules.7.html
而想用不支持其他库的话,可以自己去看看别人的项目有没有提供。如果别人有提供,你可以拷贝过来,放到项目目录下,通过下面的方式指定module目录。

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/") #工程根目录的modules文件夹下
1
find_path & find_library
这个命令是用来查找包含指定文件的文件夹。比如下面的例子

find_path(GLIB_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0")
1
这里是找glib.h的文件的位置,然后它的位置在/usr/include/glib-2.0目录下,所以我们加了一个搜索前缀glib-2.0来搜索目录。默认情况下,它会搜索系统下面的几个目录,但是有时候也可以指定几个特定路径来搜索。

find_path(GD_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0"
PATHS /usr/local /usr/include
NO_DEFAULT_PATH)
1
2
3
比如这里的NO_DEFAULT_PATH就是要求不找系统默认的几个目录。而是找PATHS指定的路径。当然如果没有指定搜索目录,会有默认的查找目录,具体查看
https://cmake.org/cmake/help/v3.0/command/find_path.html

find_library也是一样。比如找glib2.0的库,示例如下:

# Linux下
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") #设置库的前缀
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") #设置库的后缀
find_library(GLIB_LIB NAMES "glib-2.0")
# Windows下的前后缀
SET(CMAKE_FIND_LIBRARY_PREFIXES "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
1
2
3
4
5
6
7
可以查看
https://cmake.org/cmake/help/v3.0/command/find_library.htm

FindPkgConfig
这个本身是Unix/Linux下的一种库的查找方式,它们可以通过pkg-config命令来找到库文件,它的使用方法如下

g++ luabind.cpp -o luabind `pkg-config --cflags --libs luajit`
1
而CMake也对这种查找方式进行了封装,使用方法如下

include(FindPkgConfig) #加载FindPkgConfig功能
pkg_check_modules(XCB xcb REQUIRED) #查找xcb库
target_link_libraries(app ${XCB_LDFLAGS}) #链接xcb库
1
2
3
注意这种方式需要库提供pkg索引文件,一般通过Linux包管理安装的库都会带有这个文件。
其他具体信息可以看
https://cmake.org/cmake/help/v3.0/module/FindPkgConfig.html

原文地址:https://www.cnblogs.com/wangshuyi/p/12155677.html

时间: 2024-08-06 17:40:12

CMake配置工程链接库的相关文章

Eclipse C++配置静态链接库和动态链接库

转:https://blog.csdn.net/iteye_20658/article/details/82650699 1.动态库: 一.创建动态链接库1.创建工程new->project->c++ project选择Shared Library->Empty Project.输入工程名a,点击finish,完成工程的创建. 2.编写代码在windows下封装动态链接库时对要封的函数要用__declspec(dllexport)来标明,在linux下不用,在linux下只需要直接把要封

VS2013创建opencv-2.4.10静态链接库

我们平时在VS2013上借用opencv的函数时,很多时候都是以动态链接的方式调用opencv的库函数,以至于脱离了你的电脑到别的电脑上(没装opencv或装了opencv但版本跟你的不一样)运行时,运行不了,这是没有以静态链接的方式!!!!! 注意以下是建立在  在系统环境变量配置好后 步骤1: 右击我的电脑 选择 属性 在点击 高级系统设置 在点击环境变量 自己在用户变量那里新建两个变量 如下图, 变量值如下 当然路径是你自己的 注意 系统变量值后面要加 ; 即英文的分号 后面就可以开始配置

利用CMake自己创建OpenCV静态链接库(VS2012+OpenCV2.4.12+TBB)

1.准备工作: 1)完成Visual Studio2012安装: 2)下载并解压CMake3.5.0: 3)下载并解压OpenCV2.4.12: 4)下载并解压TBB44_20160128oss. 2.创建OpenCV静态链接库编译项目的目标目录. 3.由CMake生成OpenCV静态链接库编译项目: 1)双击cmake-gui.exe,删除配置缓存,选择编译平台,如下图所示: 2)选择OpenCV2.4.12源码所在目录(CMakeLists.txt所在目录)以及第2步创建的静态库项目目标目录

AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake. 谷歌从AndroidStudio2.2以上就添加了Cmake方式来编译NDK代码,并从NDK例子看出,默认编译的方式就是cmake方式.   2.谷歌官方的用cmake方式编译NDK的教程 谷歌从AndroidStudio2.2以上就添加了Cmake方式来

可移植的配置visual studio工程第三方库

现在编程有太多的好用的第三方库,例如 计算机视觉方面的opencv c++的扩充库boost 特殊的第三方库,相机库,通讯库等 使用这些库给我们带来了极大的便利,同时也有很多困扰.这个工程在我电脑上明明很好用的,但是为什么在你电脑上就没法编译呢? 这是工程配置的不好造成的.很多人在配置工程引用文件的时候使用绝对地址,例如配置opencv的include文件,配置地址为C:\opencv\build\include\opencv.但是在另一个电脑上,opencv可能不在这个地址,这时候vs就无法找

配置使用OpenCV静态链接库

配置opencv静态链接库需要用到:staticlib 在配置链接器->附加库目录时应该为staticlib的路径.同理若是利用动态链接库则只需要lib的路径: 动态链接库则使用lib,然而在使用staticlib的时候报了一些错误: 无法解析的外部符号 "public: __thiscall cv::SIFT::SIFT(int,int,double,double)... 应该是没有成功调用到sift模块,因为opencv中的sift模块处于nonfree: 所以应该是静态库中lib没有

codeblocks: 使用静态(static)链接库(pcre)的配置

说明:在c/c++程序中使用静态链接库,编译后不再需要相关的dll文件(如:libpcre-1.dll,libpcreposix-0.dll)就可以正常的运行. 现在遇到一个问题,如果使用 pcre_posix, 使用静态链接库,编译失败: 提示错误:undefined reference to `pcre_fullinfo'| 不知该如何解决. 2014-06-27

C++中的动态链接库和静态链接库

转自 作者:吴秦出处:http://www.cnblogs.com/skynet/ 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养--链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式

Windows 下动态链接库和静态链接库

1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快. 缺点在于一套代码可能在内存中有多份拷贝,占用内存. 2.动态链接库:库由windos api加载库代码,内存中只有一份拷贝.工程中只保留链接到这份代码的引用,有两种动态链接库, (a)load time dynamic linking:工程运行的时候自动加载,结束时自动卸载 (b) run time dynamic linking: 在工程运行过程中通过调用LoadLibrary()和GetProcAddress