c++程序员一般都会使用make工具,在大型项目中还会使用cmake。这篇文章对于make编译的过程探讨的比较详细,可以参考:https://blog.csdn.net/qq_29094161/article/details/86760056。刚好现在就要使用make和cmake工具安装opencv,于是开始尝试:https://www.cnblogs.com/you-siki/p/OpenCV4-MacOS.html
make -v, cmake -version可以看到,make和cmake是两个不同的工具(命令),make是GNU开发维护的免费软件,cmake是Kitware公司开发维护的免费软件,它们都是开源免费的(大赞,像这种免费工具软件,对于促进生产力发展大大有利,为我等屌丝开启了新世界)。Kitware就是那个开发VTK库的公司,广泛用于计算机图形学领域,比如CAD,CAE等领域。
回顾我们开发c/c++程序的过程,一般从源码.cpp到可执行的机器码,需要源码文件,一般也会引用别人的库文件,make就是处理文件间的依赖关系的shell命令,其依赖和构建规则使用Makefile说明,这里推荐阮一峰老师的make教程。下面老说说makefile文件的编写:
<target> : <prerequisites> [tab] <commands>
这就是makefile的构成单元,非常简单明了,其中,commands就可以使用g++命令了。这样我们可以直接执行makefile文件,而不是逐个编译,链接,大大提高了工作效率。make install其实是一个约定的target,用于向计算机中写入库文件。make -D CMAKE_INSTALL_PREFIX=/usr/local,用于指定安装路径,cmake默认会安装在,usr/local中。
可以看到,如果程序规模很大,编写Makefile也工作量也会很大,并且其修改也会很麻烦,于是cmake工具来啦,简单一句话就是生成Makefile的工具,其核心是CMakeLists.txt,这是一个典型的CMakeLists.txt的写法,它其中体现了很多特殊的命令,比如cmake_minimum_required要求对于cmake版本的支持,project命令说明了其工程的名字。if,else,set等命令的支持等。
#一般都以这一行开始 cmake_minimum_required (VERSION 2.6) #项目名 project (TEST) #选择编译器,LINUX上选择g++,MAC OS上选择clang++ if (APPLE) set (CMAKE_CXX_COMPILER clang++) elseif (UNIX) set (CMAKE_CXX_COMPILER g++) endif() #设置编译器选项支持c++11 set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++11) #查找boost库 find_library (BOOST_SYSTEM NAMES boost_system PATHS /usr/lib /usr/local/lib ) find_library (BOOST_THREAD NAMES boost_thread PATHS /usr/lib /usr/local/lib ) #设置数学库的目标名,该变量在子目录也是可见的 set (MATH_LIB "my_math") #添加头文件搜索路径 include_directories (./math) #添加子目录,这样math目录才会被编译 add_subdirectory (math) #添加可执行目标文件Test add_executable (Test main.cpp) #LIBS变量存储所有需要链接的库 set (LIBS ${MATH_LIB}) if (BOOST_SYSTEM) set (LIBS ${LIBS} ${BOOST_SYSTEM}) endif() if (BOOST_THREAD) set (LIBS ${LIBS} ${BOOST_THREAD}) endif() #为可执行文件链接数学库 ———————————————— 版权声明:本文为CSDN博主「jupiterwangq」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ztemt_sw2/article/details/81355096
参考资料:阮一峰make教程:http://www.ruanyifeng.com/blog/2015/02/make.html
cmake官方说明文档:https://cmake.org/cmake/help/latest/guide/tutorial/index.html