CMake学习(1)---简单程序与库
来源:互联网 发布:java实战项目视频 编辑:程序博客网 时间:2024/05/16 09:36
cmake是linux平台下重要的工具,可以方便的组织makefile。之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果。但是程序的编译并没有那么简单。
写一个程序大约可以分为以下几个部分
- coding,写代码,可以写在记事本里。
- 组织编译文件。说明各个代码文件之间的关系。
- make&link,根据组织好的编译文件和连接关系,将编译好的碎片组织成一个完整的可执行文件。
cmake完成的工作就组织编译文件,说明代码对库的调用关系以便于代码对库进行链接。
helloworld
用cmake组织一个helloworld程序是开始cmake学习的基础。首先要有两个文件夹,一个存放源文件一个存放build之后得到的文件。
文件夹组织为
project
├── build
└── src
├── CMakeLists.txt
└── hello.cpp
其中src中存放.cpp文件和CMakeLists.txt文件。这里尤其要注意一点
- 如果用了c++的库,那么必须写成.cpp,否则会无法识别c++的库函数如cout
- CMakeLists.txt一定不能拼错!!!!!头两个字母都是大写,最后有s,文件格式是.txt
project(HELLO)set(SRC_LIST hello.cpp)add_executable(hello ${SRC_LIST})
CMakeLists.txt文件
可以看出CMakeLists.txt的编写方式还是处处表达它的unix基因,变量定义和取值的方式都和shellscript精神相呼应。
- 关键字set用来定义变量这里既可以用SRC_LIST也可用其他字母,但是最好好记。
- add_executable语句用来生成可执行文件
- CMakeLists.txt里的add表达的大多是生成的意思。${SRC_LIST}是取值的意思,和linux变量取值一样~~~
#include <iostream>using namespace std;int main(){ cout<<"hello world"<<endl; return 1;}
hello.cpp文件
这里的main函数似乎不能使用void定义,否则会提示main函数必须有返回值,应该是编译器的问题。
分离式编程
分离式编程指的是分开函数,头文件,main函数并把它放在不同的文件中的编程方式。好处是文件层次分明,方便管理和代码重用。
文件结构如下
project
├── build
└── src
├── CMakeLists.txt
├── function.cpp
├── function.h
├── hello.cpp
└── main.cpp
其中CMakeLists.txt里的内容为
project(HELLO)set(SRC_LIST main.cpp function.cpp)add_executable (hello ${SRC_LIST})
可以看出,这里除了添加了main.cpp之外还添加了function.cpp,但是注意没有.h文件什么事。
如果用qt 打开CMakeLists.txt的话,在文件组织里是会显示.h文件的。
.h文件里包含了头文件iostream,并声明了打印函数,在function.cpp中完成了打印函数的定义。
多文件夹分离式编译
所实现的功能一多就很麻烦,需要很多代码。代码都混在一起是一件很纠结的事情,所以使用不同的文件夹存放代码。
project5
├── build
├── CMakeLists.txt
├── lib
│ ├── CMakeLists.txt
│ ├── CMakeLists.txt~
│ ├── function.cpp
│ └── function.h
└── src
├── CMakeLists.txt
├── CMakeLists.txt~
└── main.cpp
这里可以看出,在工程文件夹下有build文件夹,lib文件夹,src文件夹三种,每个文件夹下都要有CMakeLists.txt来说明文件夹之间的关系和文件夹内容。
project文件夹下:总CMakeLists.txt
project(HELLO)add_subdirectory(lib)add_subdirectory(src)
这里有生成子目录lib和子目录src,这个子目录是在build文件夹下,不是工程文件夹下。
lib文件夹下: 库CMakeLists.txt
set(LIB_SRC function.cpp)add_library (libhello ${LIB_SRC})set(PROJECT_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
- 设置编译生成库的源文件
- 生成库
- 设置库的输出目录,其中PROJECT_BINARY_DIR,是指工程二进制文件目录,简而言之,build目录。
在CMakeGUI中第二个选项是where to build the binaries,选了build。
src文件夹下:源文件CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/lib)#link_directories(${PROJECT_BINARY_DIR}/lib)set(APP_SRC main.cpp)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)add_executable (hello ${APP_SRC})target_link_libraries(hello libhello)
- 头文件所在位置。PROJECT_SOURCE_DIR是在CMakeGUI中选择的源文件所在位置。
- 库文件所在位置,原本库文件直接生成在build文件夹中,就不需要此句。但是现在修改了库文件输出位置,必须重新说明。
- 设置变量APP_SRC的内容
- 设置可执行文件输出位置
- 生成可执行文件hello,其变量是APP_SRC
- 设置可执行文件所要链接的库。
下面是完整的源代码
main.cpp
#include "function.h"int main(){print();return 0;}
function.cpp
#include "function.h"using namespace std;int print(){ cout<<"this is a cmakeprogram"<<endl; return 0;}
function.h
#include <iostream>int print();
动态链接库
把add_library(XXlib
- CMake学习(1)---简单程序与库
- 【WIN32】CMake的学习总结 1——一个简单的Hello World程序
- CMake的简单学习笔记
- CMake学习-添加exe程序
- CMake学习笔记(1)——用CMake编译一个hello world程序
- CMake学习--1
- cmake学习(一)静态库与动态库构建
- cmake学习(一)静态库与动态库构建
- cmake学习(一)静态库与动态库构建
- 【学习cmke】find_package与CMake如何查找链接库详解
- cmake简单使用-生成库
- cmake常用指令-1 find_package与CMake如何查找链接库详解
- CMake 学习笔记整理(1)
- 使用 gcc 和 CMake 编译简单的 OpenCV 程序
- CMake入门---最简单的helloworld程序
- PODOFO编译之1——CMake安装与简单测试
- 【学习cmake】CMake的CMakeLists.txt剖析-1
- cmake学习
- 12-bit_operation
- Linux电源管理_Wakeup events framework--(二)
- android ActivityManagerService 源码分析----Activity管理(二)
- Windows Phone 8.1中绑定数据转换
- 汇编第一操作数&第二操作数的区别
- CMake学习(1)---简单程序与库
- android 学习随笔(屏幕的横屏和竖屏)
- java.lang.NullPointerException at org.hibernate.type.LongType.next(LongType.java
- Oracle开发专题之:%TYPE 和 %ROWTYPE(转)
- phpcms头部代码详细分析 转载收藏
- 13-++.--
- 4.1 三维变换
- Design Patterns - Visitor Pattern
- IOS 获得版本