两周的实践跟各种交叉编译斗争了 N 次。大概对编译,交叉编译,CMAKE 有了一丁点的理解。
其实也是一知半解,写点东西,分享一下。
接用百度词条:编译 (compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。
GNU Compiler Collection(GUN 编译器集合),它可以编译 C、C++、JAV、Fortran、Pascal、Object-C、Ada 等语言。
gcc 是 GCC 中的 GUN C Compiler(C 编译器)
g++ 是 GCC 中的 GUN C++ Compiler(C++ 编译器)
一个有趣的事实就是,就本质而言,gcc 和 g++ 并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的 GUN 编译器而已,比如,用 gcc 编译一个 c 文件的话,会有以下几个步骤:
Step1:Call a preprocessor, like cpp.
Step2:Call an actual compiler, like cc or cc1.
Step3:Call an assembler, like as.
Step4:Call a linker, like ld
由于编译器是可以更换的,所以 gcc 不仅仅可以编译 C 文件
所以,更准确的说法是:gcc 调用了 C compiler,而 g++ 调用了 C++ compiler
CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装 (编译过程)。他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性,类似 UNIX 下的 automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
CMAKE 有自己的一套语法,和自己内部提供的编译变量用来生成编译文件。
这两周被逼着写了 1 周多 CMAKE,还不能太 LOW,收获也挺多。
交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
ANDROID 的 NDK, Linaro 的 GCC 工具都是交叉编译器集合。
我个人理解:
1.可以使用不同的平台编译统一平台的可执行代码,比如可以在 WIN/LINUX 的 X86 架构下,编译 ARM 的 OPENCV 库,供 ARM 使用。
2.有些资源稀缺的环境,比如一些 ARM 板,在本地编译的空间使用过大,浪费资源。
1.代码基于 C++,C 编写,性能有优势。
2.底层操作更方便,比如对于 OPENCV 来说,ANDROID 的 OPENCV SDK 的接口是被阉割过的,有些特性需要自己定制编译,需要使用交叉编译。
3.不依赖 IDE,使用统一的编译工具链,移植性还行。
缺点也很明显,三方库的编译也要都跑一遍交叉编译,如果依赖三方库过多,就坑了。
PS:最后还是 X86 的服务器好,不需要交叉编译,大部分都是现成的,搭环境的成本低 N 倍,苦逼的 ARM。。。