即便作为一个 Javaer,假如想要在 *nix 渠道下运用一些新版别的框架或软件,也得不可避免地需求自己从官方下载源代码,然后编译成可执行程序。比方编译 Hadoop,Redis,亦或许是 JDK 的源代码 ( JVM :从手动编译 JDK 开始 – ())。即便咱们不专门从事 C/C++ 开发,应该也会对下面的指令比较了解了:
./configue
cmake ..
make && make install
除此之外,官网通常会要求编译的环境包括但不限于这些东西,比方:g++
,gcc
,make
,cmake
等等。本篇简略地对这些东西做一些根本介绍,包括怎么跨环境 DEBUG 或许是编写 C/C++ 代码,以 CLion IDE 为例。
编译源码所需的东西
假如仅仅运用官方供给的框架,那么一般根据官方的指示装置相关版别的东西即可。假如是 C/C++ 开发者,挑选哪些东西取决于团队需求。
gcc / g++
简略来说,gcc ( GNU C Complier ) 担任处理 C 程序,而 g++ ( GNU C++ Complier ) 担任处理 C++ 程序。但事实上,两者都能够编译 *.c
和 *.cpp
文件,其主要的差异是:
- gcc 会区分处理
*.c
和*.cpp
文件; - g++ 将两者都视作
*.cpp
进行处理。
谨慎地说,gcc/g++ 自身并不是编译器,它们倒更像是一个 driver:用于驱动 cc1
,cc1plus
等编译器。运用 g++ 编译文件时,g++ 会主动链接规范库 STL,而 gcc 不会主动链接 STL。
make
make 东西处理了一个大型 C/C++ 项意图编译问题。首要,它需求一个 Makefile
文件来指示它应该怎么作业:比方工程中的哪些源文件需求编译以及怎么编译、需求创立那些中心文件以及怎么创立这些中心文件、怎么最后发生咱们想要得可执行文件,等等。不过,由于编写 Makefile
自身也是一件苦楚的作业,因而有必要在 make
的根底上再引进两个东西:./configure
,Cmake
。它们都能够起到简化编写 Makefile
的效果。
咱们经常会运用这两个组合的指令:make && make install
。其间,make
担任编译项目,而 make install
则担任装置。
./configure
./configure 本质上是一种叫 autoconf 的构建东西主动生成的构建文件,它以 shell script 的形式存储,在 Cmake 之前是 C/C++ 的主流构建东西,根据 configure
规则文件代替开发者生成 Makefile
。
Cmake
Cmake 的全称是 Cross Plaform Make。故名思义,它是一个跨渠道编译东西,能够用简略的句子描述一切渠道的装置 / 编译过程。
比方说,Windows 下的 C/C++ 开发者一般会直接运用 Visual Studio 自带的东西生成项目,而 Linux 环境下的开发者则有或许运用 QT Creater 东西生成项目,可是两个不同渠道上面的项目不能相互移植,这就有了 CMake 的用武之地。开发者能够先编写一个 CMakeLists.txt
文件,将需求的 .h
和 .cpp
文件包括进来,然后在不同的渠道运用 CMake 东西调用各自的编译器生成各自的兼容于渠道的工程 ( 这和 Java 的跨渠道思路根本共同 )。
Cmake 在 Linux/Unix 渠道生成 makefile
,在 Mac 渠道生成 xcode
,在 Windows 渠道,能够生成 MSVC 的工程文件。
别的,跨渠道编译同一个项目时,环境不匹配是运行失败的一大原因。假如 OS 中默许的 g++/gcc 不是官方指定的 ( 或许是团队所束缚的 ) 版别,或许是 OS 内保留了多个版别的 gcc/g++ ,那么有两种办法处理:
榜首种办法,进入 CMakeLists.txt
文件内部进行修正:
SET(CMAKE_C_COMPILER "/home/public/local/bin/gcc")
SET(CMAKE_CXX_COMPILER "/home/public/local/bin/g++")
第二种办法,在调用 cmake
东西之前主动声明环境变量 ( 这是暂时的,退出指令行之后就会失效 ):
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
make 短少依靠库的处理办法
在少部分情况下,make 源码的过程中或许会因为短少依靠库而出错:
canning dependencies of target bitmap_test
[ 91%] Building CXX object unitest/CMakeFiles/bitmap_test.dir/bitmap_test.cpp.o
[ 92%] Linking CXX executable ../bin/bitmap_test
/home/lijunhu/Documents/miniob_X/build/bin/bitmap_test: error while loading shared libraries: libevent-2.2.so.1: cannot open shared object file: No such file or directory
比方,笔者曾经在运用 make 东西编译 googleTest 框架的过程中遇到上述的过错,显现的原因是短少依靠的 libevent-2.2.so.1
库。这有两种或许性:
- 短少这个库。
- 这个库不在体系的查找途径内。
能够经过 find
指令查看这个库在环境内是否存在:
find / -name xxx.so
假如库文件的确存在,那么仅有的或许性就是它不在体系的库文件 (.so) 查找途径上了。榜首种办法是将库文件挪动到 /usr/lib
下:
sudo cp xxx.so /usr/lib/
另一种不错的处理方案是运用 ldconfig 增加体系的查找途径。
过程 1. 编辑链接装备文件。编辑 vim /etc/ld.so.conf
,确认内容是否为如下,不是则修正为如下:
include /etc/ld.so.conf.d/*.conf
过程 2. 进入 /etc/ld.so.conf.d
目录内,创立 *.conf
文件。文件名随意,扩展名有必要为 .conf
。
cd /etc/ld.so.conf/
vim mylib.conf
过程 4. 在文件内部,增加 .so
的途径,保存并退出。
过程 5. 执行指令时期收效。
sudo ldconfig
程序在运行时寻找 .so
库就会到增加的目录中寻找。
用 CLion 在长途布置 / 调试 C/C++ 代码
这种长途 DEBUG 的办法能够推行到 IntelliJ IDEA,Goland 等 JET BRAINS 公司旗下的其它编译器。
出于二次开发,或许是调试的意图,咱们有时候或许会需求跨渠道对 C/C++ 进行编译。比方,笔者的本地环境是 Windows,但作业环境却是 Linux。因而,想要在 Windows 上装置 make,就得先去装置一个 MinGW 东西,再挑选下载依靠的包。
假如已经在云服务器 / 虚拟环境中有了现成的 C/C++ 环境,那么本机只需担任写源代码,然后在 Run / Debug 的场合再将这些源代码上传到已有环境去编译就好了 —— 下面以 CLion 东西为例介绍怎么完成,这大概分为三个过程:
- 在本地进行编码。
- 在编译之前,将本地的代码发送到远端。
- 用远端的 Cmake,make 等东西进行编译,DEBUG。
这种长途作业的思路能够推行到衔接云服务器的情形,后边简称为远端。
运用远端环境编译并 DEBUG
本机只担任编写代码,那么就不需求额定的 Cmake,make 东西这些东西了。在 ToolChains 选项中新建一个 Remote Host,然后与远端建立一个 SFTP 衔接。
首要需求装备好 gcc,g++ 环境来确保 CMake 东西的运行。留意,笔者这儿主动装备了 C Compiler 和 C++ Compiler 的途径,因而这儿手动更改 gcc/g++ 的 path。默许情况下,在衔接成功之后,IDE 便能够主动探测 CMake,make,gcc,g++ 的途径。装备结束后,挑选 OK。
在设置的 Cmake 项中,将方才装备的 Toolchains 选上,挑选 OK。
之后,程序后续的 Run / DEBUG 将在远端进行。之后只需求在本地进行编程,随后将代码发送到长途,然后 DEBUG 即可。在每次 DEBUG 的时候,代码会主动布置到长途的 /tmp/...
某个暂时文件夹下保存运行。
仅将项目源代码提交到远端
假如仅仅是想将代码上传到远端,打开 CLion 上方视窗的 Tools -> Development 即可设置:
点开 Configuration,进入装备界面,新建衔接,衔接办法挑选 SFTP。
Connection 填写结束之后,不要关闭窗口,进入 Mappings,装备本地代码上传到远端的途径。
这些内容全装备结束之后,挑选 OK,保存装备。现在,在项目根目录中右键 Development ( 或许在 Tools -> Development ) 傍边,能够看到有 Upload 选项了:
能够自行设置 CLion 是否要实时上传代码更新。
参考资料
CLion 长途开发和调试C/C++代码 – IUNI_JM – 博客园 (cnblogs.com)
CLion 完成长途调试_Leo的博客-CSDN博客_clion 长途调试
CMakeLIsts.txt与Makefile的差异_jay463261929的博客-CSDN博客
c++编程根底(二)——Makefile与cmake入门_potxxx的博客-CSDN博客_cmake makefile
gcc和g++是什么联系? – 知乎 (zhihu.com)
configure、 make、 make install 背后的原理(翻译) – 知乎 (zhihu.com)
浅谈 make 东西 – 银河 – 博客园 (cnblogs.com)
CLion 长途开发和调试C/C++代码 – IUNI_JM – 博客园 (cnblogs.com)
CLion 完成长途调试_Leo的博客-CSDN博客_clion 长途调试