cmakecmake 编译选项 后面的点是什么意思

Cmake 设置交叉编译环境_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Cmake 设置交叉编译环境
来源:Linux社区&
作者:hhko12322
我用的是合众达的dm6446.
一& 首先安装CMAKE
下载cmake 然后解压缩,进入解压缩后的目录,依次执行
# ./bootstrap# make && make install
安装过程需要几分钟。
二 构建交叉编译的CMakeLists.txt
设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译:
SET(CMAKE_SYSTEM_NAME Linux)
在通知CMake要交叉编译以后,还要告诉CMake到哪个路径下去找库文件,因为在交叉编译的时候CMake是不会自动去系统默认的目录找库文件和头文件的:
SET(CMAKE_FIND_ROOT_PATH "编译器环境路径")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  其中的第一行,是告诉CMake查找的根目录是什么。后面分别是告诉CMake怎么查找编译时候的工具程序的位置、库的位置和头文件的位置。设置为NEVER表示不查找,设置为ONLY表示只在CMAKE_FIND_ROOT_PATH设定的目录下查找,设置为BOTH(这是默认选项)表示既可以在系统目录下查找,也可以在CMAKE_FIND_ROOT_PATH下查找。因为咱们是交叉编译,所以后两项的设置了ONLY,对于编译时调用工具,一般来说是需要在系统目录下查找的,不过我不需要所以设置为NEVER。
  然后,设置编译器:
SET(CMAKE_C_COMPILER "编译器环境路径")
  直接把编译器的路径设置过去就可以了,CMAKE_C_COMPILER是C语言编译器,CMAKE_CXX_COMPILE是C++语言编译器。
所以 在工程主CMakeLists.txt 中首先加入如下:
SET(CMAKE_SYSTEM_NAME Linux) SET(TOOLCHAIN_DIR "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le")SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-gcc)SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-g++)
三 生成可调试版本的程序
1使用CMAKE编译确实很方便。但CMAKE默认编译出来的程序不带有符号文件,用GDB无法调试。
2 要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug
例如:在build文件中输入:
cmake .. -DCMAKE_BUILD_TYPE=Debug
这样产生的makefile文件make生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。
*****另外有另一种更好的方法是在工程主CMakeLists.txt中的PROJECT语句后加入一句
SET(CMAKE_BUILD_TYPE Debug)
CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 Makefile。
CMake 需要重点记住的命令和量
一& MESSAGE 命令
MESSAGE(STATUS "THIS IS A BINARY DIR" ${HELLO_BINARY_DIR})
STATUS 表示将要输出前缀为&--&的信息,可以替换为
FATAL_ERROR:立即终止CMake过程
SEND_ERROR:产生错误,生成过程被跳过
二 IF 与ELSEIF 、ELSE、ENDIF
IF(表达式)
ELSEIF(表达式)
ELSE(表达式)
相关资讯 & & &
& (02月27日)
& (05/21/:14)
& (02月28日)
& (12/09/:18)
& (01/20/:31)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款3264人阅读
多数情况下,可以直接使用OpenCV自带的库文件,但是如果是为了方便调试:
1. 方便调试opencv源码
2. 为了与某些库兼容
还是需要重新编译opencv的源码。
OpenCV1.0版本有,之分,在&文件夹下面已经存在了一个的工程文件,直接用或者,就可以打开该工程,从而可以进行相应的编译工作;而对于及以后的版本而言,就没有类似的工程文件了。这个时候,就需要你自己利用工具来生成一个的工程文件了。
CMake编译OpenCV
OpenCV的下载与安装
下载Windows下的安装文件OpenCV-2.4.3.exe,双击解压,选择需要的安装目录即可。我的存放路径为D:\opencv。
解压完成后就是需要的文件了。注意相应的目录不能包含中文。
编译OpenCV
这一步不是必须的,如果不编译,可以使用编译好的库,但是不能进行源代码的跟踪调试(未验证),因此这里还是编译一下。
编译用的工具Cmake,这是一个跨平台的安装编译工具,主要用于把OpenCV的源码生成对应的VS工程。操作如下。
1、如图所示,设置OpenCV的安装文件路径和想要生成的文件路径;
2、点击左下方configure,在弹出的选项中选择Visual Studio 10(对应2010版本);
3、点击完成就会进行配置,配置后的界面如下图所示,选择需要加入的文件,我这里勾上BUILD_EXAMPLES其他选项默认;
4、修改完成后再次点击configure进行配置,完成后点击Generate,至此完成配置。
使用VS2010编译版本库
以上操作完成后,就可以在生成的目录下找到对应的工程文件,根据上图配置我的文件路径为D:\OpenCV24\OpenCV.sln,使用VS2010打开,进行如下操作。
1、在Debug下,选择解决方案(解决方案资源管理器)里的 解决方案“OpenCV”,点右键,运行&重新生成解决方案&;
2、生成成功后,在选择INSTALL项目,右键运行生成;
3、在Release下进行1-2步的操作;
4、以上操作完成后,针对当前的系统的OpenCV库就生成了。
VS的相关配置
也即告诉VC去什么地方寻找OpenCV的头文件和库,打开VC,选择菜单“工具”-&“选项”-&“项目和解决方案”-&“VC++目录”-&“包含文件”,在VS2010中此选项打开如下图所示,显示编辑功能被否决。
可以在具体的项目中右键-&属性来设置,只是这样的设置无法被继承,每一个项目都需要单独设置,因此需要丛一个能够被继承的全局设置,方法如下:
1、在VS中确保至少有一个工程被打开的情况下,点击“视图”-&“其他窗口”-&“属性管理器”,然后从左侧任意项目中打开“Debug| Win32”-&“Microsoft.Cpp.Win32.user”,如下图所示。
2、在弹出如下图所示的窗口中,添加文件包含与库的路径。点击左侧VC++目录,编辑右侧的包含目录与库目录,分别添加对应的路径。
对应的路径如下:
使用提供的库需要添加(对应我自己的安装目录,路径根据个人安装修改)
D:\opencv\build\include
D:\opencv\build\include\opencv
D:\opencv\build\include\opencv2
如果使用的是上文编译的库的路径,则添加(对应我自己的目录,路径根据个人安装修改)
D:\OpenCV24\install\include
D:\OpenCV24\install\include\opencv
D:\OpenCV24\install\include\opencv2
64为系统对应更改。
在OpenCV的安装文件中已经为VC预先编译好了动态库与静态库,因此可以不需要编译直接添加。
针对VS2010添加(对应我自己的目录,路径根据个人安装修改)
D:\opencv\build\x86\vc10\lib
添加上文编译的库则添加(对应我自己的目录,路径根据个人安装修改)
D:\OpenCV24\install\lib
注:有的资料中说法如下:
(注:由于自己编译成功,lib文件在Debug和Release两个文件中,加载库时需到Debug和Release中, 我配置的库目录为:D:\Program Files\OpenCV2.3.1\opencv\build\my\install\lib\Debug,否则调试时无法进入Open CV代码中。 by:Jackyzzy 赵振阳)
但是我的目录下并没有对应的文件夹,反而在D:\OpenCV24\lib目录下有对应的Debug文件夹,文件经过对比也一致,因此这个地方究竟添加什么地方的目前还没有验证,已经验证的同学欢迎告知我。
到这里,配置完毕,任意打开一个项目通过属性来查看,可以看到以上配置已经被继承。
设置环境变量
刚才设置的是动态库,因此还需要将OpenCV的dll文件所在的目录加入Path环境变量。dll文件目录如下:
自己编译的库
D:\OpenCV24\install\bin
使用提供的库(VS2010)
D:\opencv\build\x86\vc10\bin
有的资料中说由于有些函数需要使用TBB,因此需要把TBB相关也添加环境变量,但是我并没有在opencv\build\common\tbb这个路径中找到TBB文件件,在2.4.3版本中经过查找此文件夹存在与opencv\build\common\tbb 路径下,因此这部分同样未验证。
至此,就完成了OpenCV的安装与配置。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15409次
排名:千里之外
转载:18篇
(1)(5)(6)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'本博文的大概框架:内里有重复,待有时间重新整理
1, cmake 的介绍,下载,安装和使用
2, cmake 的手册详解,我关注了 -C和-G 的使用
3, 在Linux中构建cmake 的工程
第一个问题: cmake 介绍,下载和安装以及使用:https://fukun.org/archives/0421949.html
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake.org,可以通过访问官方网站来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。
cmake的流行离不开KDE4的选择。KDE开发者在使用autotools近10年之后,终于决定为KDE4项目选择一个新的工程构建工具。之所以如此,用KDE开发者们自己话来说,就是:只有少数几个“编译专家”能够掌握KDE现在的构建体系。在经历了unsermake,scons以及cmake的选型和尝试之后,KDE4最终决定使用cmake作为自己的构建系统。在迁移过程中,进展一场的顺利,并获得了cmake开发者的支持。所以,目前的KDE4开发版本已经完全使用cmake来进行构建。
随着cmake 在KDE4项目中的成功,越来越多的项目正在使用cmake作为其构建工具,这也使得cmake正在成为一个主流的构建体系。
一、为何要使用项目构建工具?
为何要使用cmake和autotools之类的项目构建工具? 我想,这恐怕是刚刚接触软件项目的人最应该问的问题之一了。
“Hello, world!“这个最经典的程序相信我们每个人都写过。无论在什么平台下,编译和运行这个程序都仅需要非常简单的操作。但事实上,hello,world最多只能算是一个实例程序,根本算不上一个真正的软件项目。
任何一个软件项目,除了写代码之外,还有一个更为重要的任务,就是如何组织和管理这些代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。使想一下,如果把一个像KDE4那么大的项目像hello world那样,把全部代码都放到一个main.cpp文件中,那将会是多么恐怖的一件事情。别说KDE4,就是我们随便一个几千行代码的小项目,也不会有人干这种蠢事。
决定代码的组织方式及其编译方式,也是程序设计的一部分。因此,我们需要cmake和autotools这样的工具来帮助我们构建并维护项目代码。
看到这里,也许你会想到makefile,makefile不就是管理代码自动化编译的工具吗?为什么还要用别的构建工具?
其实,cmake和autotools正是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的 cmake或者autotools来生成makefile,而不是上来就动手编写。
总之,项目构建工具能够帮我们在不同平台上更好地组织和管理我们的代码及其编译过程,这是我们使用它的主要原因。
二、cmake的主要特点:
cmake和autotools是不同的项目管理工具,有各自的特点和用户群。存在即为合理,因此我们不会对两者进行优劣比较,这里只给出cmake的一些主要特点:
&&&&&&&&1.开放源代码,使用类 BSD 许可发布。
&&&&&&&&2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
&&&&&&&&3.能够管理大型项目,KDE4 就是最好的证明。
&&&&&&&&4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
&&&&&&&&5.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。
&&&&&&&&6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
三、安装cmake
安装cmake 对任何用户而言都不该再成为一个问题。几乎所有主流的Linux发行版的源中都包含有cmake的安装包,直接从源中添加即可。当然,也可以在官方网站下载源代码自行编译安装。
对于Windows和Mac用户,cmake的官方网站上有相应的安装包,下载安装即可,无须赘述。
注:为了能够测试本文中的实例程序,如果读者的Linux系统中所带的cmake版本低于2.6,请从官网下载2.6版本或以上的源代码进行编译并安装。
在linux下安装cmake
首先下载源码包
&&&&&&&&http://www.cmake.org/cmake/resources/software.html
&&&&&&&&这里下载的是cmake-2.6.4.tar.gz
随便找个目录解压缩
&&&&&&&&tar
-xzvf cmake-2.6.4.tar.gz
&&&&&&&&cd
cmake-2.6.4
&&&&&&&&依次执行:
&&&&&&&&./bootstrap
&&&&&&&&&make
&&&&&&&&make
&&&&&&&&cmake 会默认安装在 /usr/local/bin 下面
四、从“Hello, world!”开始
了解cmake的基本原理并在系统中安好cmake后,我们就可以用cmake来演示那个最经典的”Hello, world!”了。
第一步,我们给这个项目起个名字——就叫HELLO吧。因此,第一部为项目代码建立目录hello,与此项目有关的所有代码和文档都位于此目录下。
第二步,在hello目录下建立一个main.c文件,其代码如下:
&&&&&&&&#include
&&&&&&&&int
main(void)
&&&&&&&&&&&&&&&&printf(”Hello,Worldn”);
&&&&&&&&&&&&&&&&return
第三步,在hello目录下建立一个新的文件CMakeLists.txt,它就是 cmake所处理的“代码“。其实,使用cmake管理项目本身也是在编程,所以称之为“代码(或脚本)”并不为过。在CMakeLists.txt文件中输入下面的代码(#后面的内容为代码行注释):
&&&&&&&&#cmake最低版本需求,不加入此行会受到警告信息
&&&&&&&&CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
&&&&&&&&PROJECT(HELLO) #项目名称
&&&&&&&&#把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
&&&&&&&&AUX_SOURCE_DIRECTORY(. SRC_LIST)
&&&&&&&&#生成应用程序 hello (在windows下会自动生成hello.exe)
&&&&&&&&ADD_EXECUTABLE(hello ${SRC_LIST})
至此,整个hello项目就已经构建完毕,可以进行编译了。
第四步,编译项目。
为了使用外部编译方式编译项目,需要先在目录hello下新建一个目录build(也可以是其他任何目录名)。现在,项目整体的目录结构为:
&&&&&&&&hello/
&&&&&&&&|– CMakeLists.txt
&&&&&&&& |– build /
&&&&&&&&`– main.c
在windows下,cmake提供了图形界面,设定hello为source目录,build为二进制目录,然后点击configure即可开始构建,之后进入build目录运行make命令编译。
在linux命令行下,首先进入目录build,然后运行命令(注:后面的“..”不可缺少):
该命令使cmake检测编译环境,并生成相应的makefile。接着,运行命令make进行编译。编译后,生成的所有中间文件和可执行文件会在build目录下。 下面是我在ubuntu上的运行过程:
&&&&&&&&$ ls
&&&&&&&&hello
&&&&&&&&$ cd hello/build/
&&&&&&&&$ ls
&&&&&&&&$ cmake ..
&&&&&&&&– The C compiler identification is GNU
&&&&&&&&– The CXX compiler identification is GNU
&&&&&&&&– Check for working C compiler: /usr/bin/gcc
&&&&&&&&– Check for working C compiler: /usr/bin/gcc — works
&&&&&&&&– Detecting C compiler ABI info
&&&&&&&& – Detecting C compiler ABI info - done
&&&&&&&&– Check for working CXX compiler: /usr/bin/c++
&&&&&&&&– Check for working CXX compiler: /usr/bin/c++ — works
&&&&&&&&– Detecting CXX compiler ABI info
&&&&&&&&– Detecting CXX compiler ABI info - done
&&&&&&&&– Configuring done
&&&&&&&&– Generating done
&&&&&&&&– Build files have been written to: /home/kermit/Project/cmake/hello/build
&&&&&&&&$ make
&&&&&&&&Scanning dependencies of target hello
&&&&&&&&[100%] Building C object CMakeFiles/hello.dir/main.c.o
&&&&&&&&Linking C executable hello
&&&&&&&&[100%] Built target hello
&&&&&&&&$ ls
&&&&&&&&CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
&&&&&&&&$ ./hello
&&&&&&&&Hello,World
上面,我们提到了一个名词,叫外部编译方式。其实,cmake还可以直接在当前目录进行编译,无须建立build目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake生成的makefile无法跟踪所有的中间文件,即无法使用”make distclean”命令将所有的中间文件删除。因此,我们推荐建立build目录进行编译,所有的中间文件都会生成在build目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。
第二个问题: cmake 的手册详解:/coderfenghc/archive//CMake_ch_01.html
我主要用的是 -C 和 -G 参数
公司的一个项目使用CMake作为跨平台构建工具;业务有需求,当然要好好研读一下官方的技术手册。目前的计划是先把官方手册翻译一下,了解清楚CMake中的各种命令、属性和变量的用法。同时在工作中也会阅读CMake的真实源码,后续会基于此陆续写一些工程中使用CMake的心得。CMake的版本也在不停更新,有些新的命令和变量会随着版本更新添加进来,这是后事了,暂且不管;现在锁定CMake 2.8.3作为手册翻译的版本。
&&&&& 作为园子里的新丁,文章在术语和表达等等方面会有欠缺的地方,还请大侠们慷慨指点。另外,罗马不是一天建成的,长长的手册翻译完也不知道要经历多少日升月落;不过还是希望自己能够坚持下去:-)。
&CMake2.8.3 主索引
命令名称用法描述命令选项生成器命令属性全局域属性目录属性目标属性测试属性源代码属性Cache Entries属性兼容性命令CMake 标准模块CMake策略变量改变行为的变量描述系统的变量语言变量控制构建的变量提供信息的变量版权其他参考资料
&&&& cmake - 跨平台Makefile生成工具。
  cmake [选项] &源码路径&
  cmake [选项] &现有构建路径&
  cmake可执行程序是CMake的命令行界面。它可以用脚本对工程进行配置。工程配置设置可以在命令行中使用-D选项指定。使用-i选项,cmake将通过提示交互式地完成该设置。
  CMake是一个跨平台的构建系统生成工具。它使用平台无关的CMake清单文件CMakeLists.txt,指定工程的构建过程;源码树的每个路径下都有这个文件。CMake产生一个适用于具体平台的构建系统,用户使用这个系统构建自己的工程。
-C &initial-cache&: 预加载一个脚本填充缓存文件。
  当cmake在一个空的构建树上第一次运行时,它会创建一个CMakeCache.txt文件,然后向其中写入可定制的项目设置数据。-C选项可以用来指定一个文件,在第一次解析这个工程的cmake清单文件时,从这个文件加载缓存的条目(cache entries)信息。被加载的缓存条目比项目默认的值有更高的优先权。参数中给定的那个文件应该是一个CMake脚本,其中包含有使用CACHE选项的SET命令;而不是一个缓存格式的文件。
-D &var&:&type&=&value&: 创建一个CMake的缓存条目。
  当cmake第一次运行于一个空的构建数时,它会创建一个CMakeCache.txt文件,并且使用可定制的工程设置来填充这个文件。这个选项可以用来指定优先级高于工程的默认值的工程设置值。这个参数可以被重复多次,用来填充所需要数量的缓存条目(cache entries)。
-U &globbing_expr&: 从CMake的缓存文件中删除一条匹配的条目。
  该选项可以用来删除CMakeCache.txt文件中的一或多个变量。文件名匹配表达式(globbing expression)支持通配符*和?的使用。该选项可以重复多次以删除期望数量的缓存条目。使用它时要小心,你可能因此让自己的CMakeCache.txt罢工。
-G &generator-name&:&指定一个makefile生成工具。
  在具体的平台上,CMake可以支持多个原生的构建系统。makefile生成工具的职责是生成特定的构建系统。可能的生成工具的名称将在生成工具一节给出。
-Wno-dev: 抑制开发者警告。
  抑制那些为CMakeLists.txt文件的作者准备的警告信息。
-Wdev: 使能开发者警告信息输出功能。
  允许那些为CMakeLists.txt文件的作者准备的警告信息。
-E: CMake命令行模式。
  为了真正做到与平台无关,CMake提供了一系列可以用于所有系统上的的命令。以-E参数运行CMake会帮助你获得这些命令的用法。可以使用的命令有:chdir, copy, copy_if_different copy_directory, compare_files, echo, echo_append, environment, make_directory, md5sum, remove_directory, remove, tar, time, touch, touch_nocreate, write_regv,
delete_regv, comspec, create_symlink。
-i: 以向导模式运行CMake。
  向导模式是在没有GUI时,交互式地运行cmake的模式。cmake会弹出一系列的提示,要求用户回答关于工程配置的一行问题。这些答复会被用来设置cmake的缓存值。
-L[A][H]: 列出缓存的变量中的非高级的变量。
  -L选项会列出缓存变量会运行CMake,并列出所有CMake的内有被标记为INTERNAL或者ADVANCED的缓存变量。这会显示当前的CMake配置信息,然后你可以用-D选项改变这些选项。修改一些变量可能会引起更多的变量被创建出来。如果指定了A选项,那么命令也会显示高级变量。如果指定了H选项,那么命令会显示每个变量的帮助信息。
第三个问题:在Linux中使用cmake 构建应用程序: /developerworks/cn/linux/l-cn-cmake/
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
编写 CmakeLists.txt。执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH
是 CMakeLists.txt 所在的目录 )。使用 make 命令进行编译。
第一个工程
现假设我们的项目中只有一个源文件 main.cpp
清单 1 源文件 main.cpp
1 #include&iostream&
3 int main()
std::cout&&&Hello word!&&&std::
为了构建该项目,我们需要编写文件 CMakeLists.txt 并将其与 main.cpp 放在 同一个目录下:
清单 2 CMakeLists.txt
1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
4 ADD_EXECUTABLE(main ${DIR_SRCS})
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号&#&后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。例如对于清单2的 CMakeLists.txt 文件:第一行是一条命令,名称是 PROJECT ,参数是 main ,该命令表示项目的名称是 main 。第二行的命令限定了 CMake 的版本。第三行使用命令 AUX_SOURCE_DIRECTORY 将当前目录中的源文件名称赋值给变量 DIR_SRCS
。 CMake 手册中对命令 AUX_SOURCE_DIRECTORY 的描述如下:
aux_source_directory(&dir& &variable&)
该命令会把参数 &dir& 中所有的源文件名称赋值给参数 &variable& 。 第四行使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 main 的可执行文件。
完成了文件 CMakeLists.txt 的编写后需要使用 cmake 或 ccmake 命令生成Makefile 。 ccmake 与命令 cmake 的不同之处在于 ccmake 提供了一个图形化的操作界面。cmake 命令的执行方式如下:
cmake [options] &path-to-source&
这里我们进入了 main.cpp 所在的目录后执行 “cmake .” 后就可以得到 Makefile 并使用 make 进行编译,如下图所示。
图 1. camke 的运行结果
处理多源文件目录的方法
CMake 处理源代码分布在不同目录中的情况也十分简单。现假设我们的源代码分布情况如下:
图 2. 源代码分布情况
其中 src 目录下的文件要编译成一个链接库。
第一步,项目主目录中的 CMakeLists.txt
在目录 step2 中创建文件 CMakeLists.txt 。文件内容如下:
清单 3 目录 step2 中的 CMakeLists.txt
1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 ADD_SUBDIRECTORY( src )
4 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
5 ADD_EXECUTABLE(main ${DIR_SRCS}& )
6 TARGET_LINK_LIBRARIES( main Test )
相对于清单 2,该文件添加了下面的内容: 第三行,使用命令 ADD_SUBDIRECTORY 指明本项目包含一个子目录 src 。第六行,使用命令 TARGET_LINK_LIBRARIES 指明可执行文件 main 需要连接一个名为Test的链接库 。
第二步,子目录中的 CmakeLists.txt
在子目录 src 中创建 CmakeLists.txt。文件内容如下:
清单 4. 目录 src 中的 CmakeLists.txt
1 AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)
2 ADD_LIBRARY ( Test ${DIR_TEST1_SRCS})
在该文件中使用命令 ADD_LIBRARY 将 src 目录中的源文件编译为共享库。
第三步,执行 cmake
至此我们完成了项目中所有 CMakeLists.txt 文件的编写,进入目录 step2 中依次执行命令 “cmake .” 和 “make” 得到结果如下:
图3. 处理多源文件目录时 cmake 的执行结果
在执行 cmake 的过程中,首先解析目录 step2 中的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src ) 时进入目录 src 对其中的 CMakeLists.txt 进行解析。
在工程中查找并使用其他程序库的方法
在开发软件的时候我们会用到一些函数库,这些函数库在不同的系统中安装的位置可能不同,编译的时候需要首先找到这些软件包的头文件以及链接库所在的目录以便生成编译选项。例如一个需要使用博克利数据库项目,需要头文件db_cxx.h 和链接库 libdb_cxx.so ,现在该项目中有一个源代码文件 main.cpp ,放在项目的根目录中。
第一步,程序库说明文件
在项目的根目录中创建目录 cmake/modules/ ,在 cmake/modules/ 下创建文件 Findlibdb_cxx.cmake ,内容如下:
清单 5. 文件 Findlibdb_cxx.cmake
01 MESSAGE(STATUS &Using bundled Findlibdb.cmake...&)
0203 FIND_PATH(
LIBDB_CXX_INCLUDE_DIR
/usr/include/
/usr/local/include/
10 FIND_LIBRARY(
LIBDB_CXX_LIBRARIES NAMES& db_cxx
PATHS /usr/lib/ /usr/local/lib/
文件 Findlibdb_cxx.cmake 的命名要符合规范: FindlibNAME.cmake ,其中NAME 是函数库的名称。Findlibdb_cxx.cmake 的语法与 CMakeLists.txt 相同。这里使用了三个命令: MESSAGE , FIND_PATH 和 FIND_LIBRARY 。
命令 MESSAGE 会将参数的内容输出到终端。命令 FIND_PATH 指明头文件查找的路径,原型如下:
find_path(&VAR& name1 [path1 path2 ...]) 该命令在参数 path*
指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR
中。清单5第3-8行的意思是在 /usr/include/
和 /usr/local/include/ 中查找文件db_cxx.h ,并将db_cxx.h
所在的路径保存在 LIBDB_CXX_INCLUDE_DIR中。命令 FIND_LIBRARY 同 FIND_PATH
类似,用于查找链接库并将结果保存在变量中。清单5第10-13行的意思是在目录 /usr/lib/
和 /usr/local/lib/ 中寻找名称为 db_cxx
的链接库,并将结果保存在 LIBDB_CXX_LIBRARIES。
第二步, 项目的根目录中的 CmakeList.txt
在项目的根目录中创建 CmakeList.txt :
清单 6. 可以查找链接库的 CMakeList.txt
01 PROJECT(main)
02 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
03 SET(CMAKE_SOURCE_DIR .)
04 SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)
05 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
06 ADD_EXECUTABLE(main ${DIR_SRCS})
0708 FIND_PACKAGE( libdb_cxx REQUIRED)
09 MARK_AS_ADVANCED(
10 LIBDB_CXX_INCLUDE_DIR
11 LIBDB_CXX_LIBRARIES
13 IF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
14 MESSAGE(STATUS &Found libdb libraries&)
INCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
MESSAGE( ${LIBDB_CXX_LIBRARIES} )
TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES}18 )
19 ENDIF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
在该文件中第4行表示到目录 ./cmake/modules 中查找 Findlibdb_cxx.cmake ,8-19 行表示查找链接库和头文件的过程。第8行使用命令 FIND_PACKAGE 进行查找,这条命令执行后 CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findlibdb_cxx.cmake 并执行。第13-19行是条件判断语句,表示如果 LIBDB_CXX_INCLUDE_DIR 和 LIBDB_CXX_LIBRARIES 都已经被赋值,则设置编译时到
LIBDB_CXX_INCLUDE_DIR 寻找头文件并且设置可执行文件 main 需要与链接库 LIBDB_CXX_LIBRARIES 进行连接。
第三步,执行 cmake
完成 Findlibdb_cxx.cmake 和 CMakeList.txt 的编写后在项目的根目录依次执行 “cmake . ” 和 “make ” 可以进行编译,结果如下图所示:
图 4. 使用其他程序库时 cmake 的执行结果
使用 cmake 生成 debug 版和 release 版的程序
在 Visual Studio 中我们可以生成 debug 版和 release 版的程序,使用 CMake 我们也可以达到上述效果。debug 版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而 release 版的不需要调试信息但需要优化。这些特性在 gcc/g++ 中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是 -O0 即不做优化;添加调试信息的参数是 -g -ggdb ,如果不添加这个参数,调试信息就不会被包含在生成的二进制文件中。
CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE
选项生成 Makefile。
现假设项目中只有一个文件 main.cpp ,下面是一个可以选择生成 debug 版和 release 版的程序的 CMakeList.txt :
1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 SET(CMAKE_SOURCE_DIR .)
45 SET(CMAKE_CXX_FLAGS_DEBUG &$ENV{CXXFLAGS} -O0 -Wall -g -ggdb&)
6 SET(CMAKE_CXX_FLAGS_RELEASE &$ENV{CXXFLAGS} -O3 -Wall&)
78 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
9 ADD_EXECUTABLE(main ${DIR_SRCS})
第 5 和 6 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 &ccmake .& 进入一个图形化界面,如下图所示:
图 5. ccmake 的界面
按照界面中的提示进行操作,按 &c& 进行 configure ,这时界面中显示出了配置变量 CMAKE_BUILD_TYPE 的条目。如下图所示:
图 6. 执行了 configure 以后 ccmake 的界面
下面我们首先生成 Debug 版的 Makefile :将变量 CMAKE_BUILD_TYPE 设置为 Debug ,按 &c& 进行 configure ,按 &g& 生成 Makefile 并退出。这时执行命令 find * | xargs grep &O0& 后结果如下:
清单 8 find * | xargs grep &O0&的执行结果
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O0 -Wall -g -ggdb
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG &$ENV{CXXFLAGS} -O0 -Wall -g -ggdb&)
这个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_DEBUG 作为编译时的参数。
下面我们将生成 Release 版的 Makefile :再次执行命令 &ccmake .& 将变量CMAKE_BUILD_TYPE 设置为 Release ,生成 Makefile 并退出。执行命令 find * | xargs grep &O0& 后结果如下:
清单 9 find * | xargs grep &O0&的执行结果
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG &$ENV{CXXFLAGS} -O0 -Wall -g -ggdb&)
而执行命令 find * | xargs grep &O3& 后结果如下:
清单 10. find * | xargs grep &O3&的执行结果
CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE &$ENV{CXXFLAGS} -O3 -Wall&)
这两个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_RELEASE 作为编译时的参数。
本文已收录于以下专栏:
相关文章推荐
使用cmake时,可以在cmakelist.txt中如下执行shell
set(LOG &log.txt&)
add_custom_command(OUTPUT
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
通过编写CMakeLists.txt,可以控制生成的Makefil...
1)EasyPR开源项目地址:/liuruoze/EasyPR
     参考:
     /liuruoze/EasyPR/b...
cmake处理源代码分布在不同目录中的情况也很简单,现在假设我们的源代码分布情况如下:
源代码的分布情况
其中src目录下的文件要编译成一个链接库
第一步,项目主目录中的CMakelist.txt...
cmake 简介
    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器...
一,cmake 变量引用的方式:
前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值
自定义变量的方式:
主要有隐式定义和显式定义两...
前言CMake是目前比较流行的跨平台构建工具,接触过跨平台项目的小伙伴应该都对他很熟悉。为了能更好的学习CMake,我打算从CMake官网的开发手册入手,系统的学习 CMake。CMake的版本也在不...
具体问题可以参考官方文档: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#section_Commands
http://zh.wikiboo...
目前我所见的Windows下编译caffe都是用VS2013。但既然现在BVLC的windows版本的caffe可以支持VS2015编译,那么就不勉强自己再去下个VS2013来特地编译caffe。
conda 使用清华大学开源软件镜像Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程配置镜像在conda安装好之后,默认的镜像是官方的,由...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 cmake 设置编译器 的文章

 

随机推荐