cmake的使用笔记
一.
cmake使用网上还蛮多的。可是当你自己去用的时候,才觉得,都不是你想要的。
自己做个记录,用法全是基本用法。
二.
我在里面直接写注释说明了,直接贴了。
1.
#cmake #1.
#
cmake_minimum_required(VERSION 2.8.2 FATAL_ERROR)
# 解决方案名称
project(real_ex) #设置宏定义,在VS的属性页--》配置属性--》C/C++-->预处理项--》预处理器定义中有sss_STATIC这个预定义。
add_definitions(-Dsss_STATIC) # 设置解决方案二进制生成路径,即debug和release路径
set(REAL_ex_EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
# 设置包含路径
set(REAL_ex_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include)
# 这样也包括源码。
set(REAL_ex_SOURCE_PATH ${PROJECT_SOURCE_DIR}/src) #添加当前级别目录下的子文件夹
add_subdirectory(src)
2.
#2.
# 宏定义,实现包含多个文件夹路径,使用方法:rw_include_module(file_a file_b)
macro(rw_include_module)
foreach(module ${ARGN})
include_directories(${REAL_ex_INCLUDE_PATH}/rw_modules/${module})
endforeach()
endmacro(rw_include_module) #宏定义,包含头文件和链接lib库。
macro(rw_include_runtime_library)
foreach(library ${ARGN})
include_directories(${REAL_ex_INCLUDE_PATH}/${library})
target_link_libraries(${PROJECT_NAME} ${library})
endforeach()
endmacro(rw_include_runtime_library)
3.
#添加所有源文件,可定义文件格式。
#说明一下:GLOB_RECURSE
#file(GLOB_RECURSE variable [RELATIVE path]
# [FOLLOW_SYMLINKS] [globbingexpressions]...)
#GLOB_RECURSE 与GLOB类似,区别在于它会遍历匹配目录的所有文件以及子目录下面的文件。
#对于属于符号链接的子目录,只有FOLLOW_SYMLINKS指定一或者cmake策略CMP0009没有设置为NEW时,才会遍历这些目录。
#
#GLOB的使用方法:
# file(GLOB variable [RELATIVE path] [globbingexpressions]...)
#
#GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。
#Globbing 表达式与正则表达式类似,但更简单。如果指定了RELATIVE 标记,
#返回的结果将是与指定的路径相对的路径构成的列表。 (通常不推荐使用GLOB命令来从源码树中收集源文件列表。
#原因是:如果CMakeLists.txt文件没有改变,
#即便在该源码树中添加或删除文件,产生的构建系统也不会知道何时该要求CMake重新产生构建文件。
macro(rw_module_source_all)
file(GLOB_RECURSE rw_module_source_list . "*.cpp" "*.c" "*.h" "*.hpp" "*.inl")
aux_source_directory(. rw_module_source_list)
endmacro(rw_module_source_all)
4.
#下面这个没有成功,说是可以设置vs上的工程下添加自己想要的文件夹(也就是VS项目中添加的筛选器)
#set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER ${REAL_ex_MODULES_PROJECT_FOLDER}) #工程生成动态链接库。
add_library(${PROJECT_NAME} SHARED ${rw_module_source_list})
#编译生成静态链接库。
add_library(${PROJECT_NAME} STATIC ${rw_module_source_list})
5.
#文件拷贝,这个找了好久,一开始不会用,试过install和configure_file.
#配置文件拷贝: configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${filename} ${CMAKE_CURRENT_BINARY_DIR})
# 发现configure_file拷贝后文件要么是0K,要么是1K,比较小。自己不会用。
# 文件拷贝:FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/glut32Copy.lib DESTINATION ${CMAKE_BINARY_DIR}/Debug)
#
# 摘抄一段说明:
# configure_file: 将一份文件拷贝到另一个位置并修改它的内容。
# configure_file(<input> <output>
#[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
#将文件<input>拷贝到<output>然后替换文件内容中引用到的变量值。
#如果<input>是相对路径,它被评估的基础路径是当前源码路径。<input>必须是一个文件,而不是个路径。
#如果<output>是一个相对路径,它被评估的基础路径是当前二进制文件路径。
#如果<output>是一个已有的路径,那么输入文件将会以它原来的名字放到那个路径下。
# 该命令替换掉在输入文件中,以${VAR}格式或@VAR@格式引用的任意变量,如同它们的值是由CMake确定的一样。
#如果一个变量还未定义,它会被替换为空。如果指定了COPYONLY选项,那么变量就不会展开。
#如果指定了ESCAPE_QUOTES选项,那么所有被替换的变量将会按照C语言的规则被转义。该文件将会以CMake变量的当前值被配置。
#如果指定了@ONLY选项,只有@VAR@格式的变量会被替换而${VAR}格式的变量则会被忽略。
#这对于配置使用${VAR}格式的脚本文件比较有用。
#任何类似于#cmakedefine VAR的定义语句将会被替换为#define VAR或者/* #undef VAR */,视CMake中对VAR变量的设置而定。
#任何类似于#cmakedefine01 VAR的定义语句将会被替换为#define VAR 1或#define VAR 0,视VAR被评估为TRUE或FALSE而定。 #(configure_file的作用是让普通文件也能使用CMake中的变量。——译注) macro(rw_copy_file_to_build_project)
foreach(filename ${ARGN})
FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${filename} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
endforeach()
endmacro(rw_copy_file_to_build_project)
6.
# 收集所有所有子文件夹中的CMakeLists.txt,到制定的变量中。
file(GLOB_RECURSE rw_module_cmake_list . "CMakeLists.txt") # 遍历添加子文件夹的源码
foreach(rw_module_cmake ${rw_module_cmake_list})
string(LENGTH ${PROJECT_SOURCE_DIR} module_prefix_length)
string(SUBSTRING ${rw_module_cmake} ${module_prefix_length} -1 rw_module_name)
string(SUBSTRING ${rw_module_name} 1 -1 rw_module_name)
string(FIND ${rw_module_name} "/" rw_module_name_length) if(NOT (${rw_module_name_length} STREQUAL -1))
string(SUBSTRING ${rw_module_name} 0 ${rw_module_name_length} rw_module_name)
set(rw_current_module_name ${rw_module_name})
add_subdirectory(${rw_module_name})
endif()
endforeach()
目前项目中使用的一些,都是比较基础的东西。若有不足之处,请各位不吝赐教。
完毕!
cmake的使用笔记的更多相关文章
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】
本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用 ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】
本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...
- CMake和Linux编程:find_package的使用
1.第一个CMake例子 在 t1 目录建立 main.c 和 CMakeLists.txt(注意文件名大小写): main.c 文件内容: //main.c #include <stdio.h ...
- Linux C 收藏
某招聘要求:熟悉高性能分布式网络服务端设计开发,熟悉epoll.多线程.异步IO.事件驱动等服务端技术: <UNIX环境高级编程(第3版)>apue.h等源码文件的编译安装 <UNI ...
- cmake学习笔记(五)
在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...
随机推荐
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- [当我在研究Cocos-2dx的源代码时,我在想什么]-Ref类,一切的起源
[名词解释] 引用计数:引用计数是现代内存管理中常常使用到的一个概念.它的基本思想是通过计数方式实现多个不同对象同一时候引用一个共享对象,详细地讲,当创建一个对象的实例并在堆上分配内存时,对 ...
- Android Studio升级到0.8.1后怎样设置字体大小?
升级到0.8.1后.打开设置字体大小页面.你会发现无论是Default还是Darcula,都不同意你改变字体的大小.事实上这个是由于这两个模式是Android Studio自带模式,所以不同意你修改, ...
- linux c statfs系统调用
statfs 系统调用原型: int statfs(const char *path, struct statfs *buf); 參数说明: path : 位于须要查询信息的文件系统的路径名(不是设备 ...
- 【Swing】一点基础操作
之前实训的老师不推荐swing就没有学...然而学校老师又是另一种态度...加上学长作比赛用swing...学一下吧 1.将窗体放在中间 jdk1.4之后setLocationRelativeTo(o ...
- iOS 基于第三方QQ授权登录
基于iOS实现APP的第三方QQ登陆.接入第三方SDK时的一个主要的步骤: 1,找到相关的开放平台.QQ互联平台,http://connect.qq.com/: 2,注冊成功后创建自己的APP.填写一 ...
- Android自定义视图
Android框架为我们提供了大量的视图类来帮助我们做好展示信息以及同用户进行交互的工作.然后有时候,我们的app或许需要一些在Android内建视图之外特殊的视图,那么此时我们就需要自定义视图.下面 ...
- mahout用到的典型测试数据集
http://archive.ics.uci.edu/ml/databases/synthetic_control/ 继续
- 洛谷P3201 [HNOI2009]梦幻布丁
题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式: 第 ...
- web.xml的配置及加载顺序
一web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...