make和cmake构建工具,linux环境源码编译
在linux环境下编程,标配的编译器是gcc,g++,以及构建工具make,cmake。linux中和开发环境密切相关的有/usr/bin(命令程序), /usr/include(源码),/usr/lib(编译的库),这些其实和c/c++的编程很密切。
1 | gcc -o NameMain name.c main.c // 典型的gcc使用方法 |
我们尝试使用在linux环境,使用make工具编译git源码。编译过程中提示找不到curl.h/curl.c文件,这个就是说该目录下没有,/usr/include目录也没有,那么就需要手动去下载。解决了这个依赖,还有其他依赖,手动安装git确实很麻烦,应为还要安装很多的依赖库,所以最好还是使用二进制安装包,比如mysql。
回顾我们开发c/c++程序的过程,一般从源码.cpp到可执行的机器码,需要源码文件,一般也会引用别人的库文件,make就是处理文件间的依赖关系的shell命令,其依赖和构建规则使用Makefile说明,这里推荐阮一峰老师的make教程。下面老说说makefile文件的编写:
1 2 | <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等命令的支持等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #一般都以这一行开始 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 |
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义