即便作为一个 Javaer,假如想要在 *nix 渠道下运用一些新版别的框架或软件,也得不可避免地需求自己从官方下载源代码,然后编译成可执行程序。比方编译 Hadoop,Redis,亦或许是 JDK 的源代码 ( JVM :从手动编译 JDK 开始 – ())。即便咱们不专门从事 C/C++ 开发,应该也会对下面的指令比较了解了:

./configue
cmake ..
make && make install

除此之外,官网通常会要求编译的环境包括但不限于这些东西,比方:g++gccmakecmake 等等。本篇简略地对这些东西做一些根本介绍,包括怎么跨环境 DEBUG 或许是编写 C/C++ 代码,以 CLion IDE 为例。

编译源码所需的东西

假如仅仅运用官方供给的框架,那么一般根据官方的指示装置相关版别的东西即可。假如是 C/C++ 开发者,挑选哪些东西取决于团队需求。

gcc / g++

简略来说,gcc ( GNU C Complier ) 担任处理 C 程序,而 g++ ( GNU C++ Complier ) 担任处理 C++ 程序。但事实上,两者都能够编译 *.c*.cpp 文件,其主要的差异是:

  1. gcc 会区分处理 *.c*.cpp 文件;
  2. g++ 将两者都视作 *.cpp 进行处理。

谨慎地说,gcc/g++ 自身并不是编译器,它们倒更像是一个 driver:用于驱动 cc1cc1plus 等编译器。运用 g++ 编译文件时,g++ 会主动链接规范库 STL,而 gcc 不会主动链接 STL

make

make 东西处理了一个大型 C/C++ 项意图编译问题。首要,它需求一个 Makefile 文件来指示它应该怎么作业:比方工程中的哪些源文件需求编译以及怎么编译、需求创立那些中心文件以及怎么创立这些中心文件、怎么最后发生咱们想要得可执行文件,等等。不过,由于编写 Makefile 自身也是一件苦楚的作业,因而有必要在 make 的根底上再引进两个东西:./configureCmake。它们都能够起到简化编写 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 库。这有两种或许性:

  1. 短少这个库。
  2. 这个库不在体系的查找途径内。

能够经过 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 东西为例介绍怎么完成,这大概分为三个过程:

  1. 在本地进行编码。
  2. 在编译之前,将本地的代码发送到远端。
  3. 用远端的 Cmake,make 等东西进行编译,DEBUG。

这种长途作业的思路能够推行到衔接云服务器的情形,后边简称为远端。

运用远端环境编译并 DEBUG

本机只担任编写代码,那么就不需求额定的 Cmake,make 东西这些东西了。在 ToolChains 选项中新建一个 Remote Host,然后与远端建立一个 SFTP 衔接。

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

首要需求装备好 gcc,g++ 环境来确保 CMake 东西的运行。留意,笔者这儿主动装备了 C Compiler 和 C++ Compiler 的途径,因而这儿手动更改 gcc/g++ 的 path。默许情况下,在衔接成功之后,IDE 便能够主动探测 CMake,make,gcc,g++ 的途径。装备结束后,挑选 OK。

在设置的 Cmake 项中,将方才装备的 Toolchains 选上,挑选 OK。

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

之后,程序后续的 Run / DEBUG 将在远端进行。之后只需求在本地进行编程,随后将代码发送到长途,然后 DEBUG 即可。在每次 DEBUG 的时候,代码会主动布置到长途的 /tmp/... 某个暂时文件夹下保存运行。

仅将项目源代码提交到远端

假如仅仅是想将代码上传到远端,打开 CLion 上方视窗的 Tools -> Development 即可设置:

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

点开 Configuration,进入装备界面,新建衔接,衔接办法挑选 SFTP。

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

Connection 填写结束之后,不要关闭窗口,进入 Mappings,装备本地代码上传到远端的途径。

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

这些内容全装备结束之后,挑选 OK,保存装备。现在,在项目根目录中右键 Development ( 或许在 Tools -> Development ) 傍边,能够看到有 Upload 选项了:

关于编译工具 make 及远程开发 C/C++ 项目的思路 (CLion)

能够自行设置 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 长途调试