CMake基础教程
如果需要配置和检查我们工程中的所有依赖,那么可以选用CMake工具;但是,这并不是必须的,因为我们可以使用其他的工具或者是IDE(比如Makefiles或者Visual Studio)来配置我们的工程。然而,CMake是最好移植的方式来配置多平台的C++项目。
1. 基本用法
CMake使用名称为CMakeLists.txt的文件,其中定义了编译和依赖处理等过程。对于一个基本的项目而言,从一个源码文件构建一个可执行程序只需要中CMakeLists.txt文件中添加两行代码即可。文件内容像下面这样:
cmake_minimum_required (VERSION 2.6) project (CMakeTest) add_executable (${PROJECT_NAME} main.cpp)
文件的第一行定义了所需的CMake版本的最小值,这一行是强制添加在CMakeLists.txt文件中,其拥有指定了从第二行开始可以使用的给定版本所定义的cmake函数;第二行的project函数用于定义工程名(这里为CMakeTest),这个名字被保存在一个名为PROJECT_NAME的变量中。最后一行,在main.cpp文件中创建一个可执行命令(add_executable()),它的名字和工程名称(${PROJECT_NAME})相同,然后将源代码编译到名称为CMakeTest的可执行文件中,也就是将可执行文件名设置为与工程名相同。${}表达式允许访问环境中定义的任何变量,因此,我们可以使用${PROJECT_NAME}变量作为一个可执行程序的输出名。假设这里的main.cpp文件是一个简单的Hello World程序,代码如下:
#include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "Hello World! " << argc << argv[0] << endl; return 0; }
将这两个文件放置在同一目录下,然后依次执行如下命令:
cmake . make
这样,我们就可以在当前目录下面看到一个名称为CMakeTest的可执行文件了。
2. 创建库文件(Creating a library)
CMake允许你创建库文件,可以被OpenCV编译系统使用。软件开发过程中,在多个应用之间共享代码是一种通用并且实用的实践。在大型应用中,或者是当相同的代码在多个应用中共享时,这种使用方式非常有用。
在这种情况下,我们不需要创建一个二进制可执行文件;取而代之,我们创建一个编译好的文件,其中包含了所有的函数、类等等,使用它来开发。我们可以将这个库文件与其它应用共享,而不需要共享我们的源代码。CMake中包含了一个add_library()函数来实现此目的:
# Create our hello library add_library(Hello hello.cpp hello.h) # Create our application that uses our new library add_executable(executable main.cpp) # Link our executable with the new library target_link_libraries(executable Hello)
以“#”开头的行为注释行,这些行会被CMake忽略掉。
命令add_library(Hello hello.cpp hello.h)定义了我们新创建的库的名称,库名称为Hello,而hello.cpp和hello.h是库的源文件。我们添加头文件以允许IDE链接到这些头文件。执行这一行命令将会产生一个共享文件(在OS X或者Unix下生成一个*.so文件,在Windows下生成*.dll文件),这取决于我们所使用的操作系统,或者是要创建动态库还是静态库。
target_link_libraries(executable Hello)用于链接我们的可执行文件executable到目标库,在这里,将会链接到Hello库中。
假设我们在hello.cpp中定义一个say()函数用于输出字符串,在hello.h文件中添加此函数的声明:
1 #include <iostream> 2 #include "hello.h" 3 4 void say(std::string text) 5 { 6 std::cout << text << std::endl; 7 }
#ifndef __HELLO_H__ #define __HELLO_H__ #include <string> void say(std::string text); #endif
然后,我们在main.cpp中添加hello.h头文件声明,然后引用Hello库中定义的say()函数,代码如下:
1 #include "hello.h" 2 3 int main() 4 { 5 say("I can say Hello!"); 6 return 0; 7 }
最后,依次执行“cmake .”和“make”命令,就可以看到最终生成的可执行文件了,点击运行查看效果。
3. 管理依赖(Managing dependencies)
CMake具有搜索我们的依赖文件以及外部库的能力,它为我们提供了编译复杂工程的基础设施,
4. 让脚本更复杂(Making the script more complex)
在这一节,