你好! 下文将详细展示在linux上对C++代码的编译与链接过程。如果你想学习如何使用g++或cmake对c++代码进行编译与链接, 可以仔细阅读这篇文章,了解一下cmake的基本语法知识。
sudo apt-get install g++
我们用g++编译器将源代码编译成一个可执行文件,使用如下命令:
g++ xxx.cpp
该命令执行完后,会在同级目录下生成a.out文件,在终端执行以下命令就可以运行此程序。
bash a.out
任何c++程序都可以用g++进行编译,但当程序规模越来越大时,一个工程可能有许多文件夹和源文件,其中一部分要编译成可执行文件,另一部分编译成库文件,曾经makefile自动编译的方式曾经也被使用,但cmake相对而言可以更加的方便管理源代码。
在一个cmake工程中,我们会用cmake命令生成一个makefile文件,然后用make命令根据这个makefile文件编译整个工程。
在源代码工程下新建一个CMakeLists.txt文件,如果需要编译库文件则添加add_library(hello libHello.cpp)
,编译后会生成libHello.a文件:
cmake_minimum_required(VERSION 2.8)
project(hello)
add_executable(hello hello.cpp)
add_library(hello libHello.cpp)
终端执行命令:
cmake .
make
此时便会对程序的主文件进行输出。
由于在编译过程中会生成很多中间文件,因此考虑将中间文件都放到build文件夹中,在编译成功后将这个中间文件删除即可:
mkdir build
cd build
cmake ..
make
静态库以.a作为后缀名,共享库以.so结尾,所有库都是一些函数打包后的集合,差别在于静态库每次调用都会生成一个副本,而共享库则只有一个副本,更省空间,如果想生成共享库而不是静态库,只需使用以下语句:add_library(hello_shared SHARED libHello.cpp)
,此时得到的文件就是libhello_shared.so。库文件是一个压缩包,里面有编译好的二进制函数,为了让别人调用这个库,我们需要提供一个头文件,说明这些库里面都有些什么,因此对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库。
#ifndef LIBHELLO_H_
#define LIBHELLO_H_
void printShare();
#endif
#include "libShare.h"
int main(int argc, char**argv){
printShare();
return 0;
}
cmake_minimum_required(VERSION 2.8)
project(hello)
add_executable(hello hello.cpp)
add_library(static libstatic.cpp)
add_library(share SHARED libShare.cpp)
target_link_libraries(hello static share)
1.程序代码由头文件和源文件组成
2.带main函数的源文件编译成可执行文件,其他的编译成库文件
3.如果可执行程序想调用库文件中的函数,则它需要参考该库提供的头文件,以明白调用的格式,同时,要把可执行程序链接到库文件上