gcc简介(对C/C++编译的控制):
-预处理(Preprocessing),-编译(Compilation), -汇编(Assembly), -链接(Linking)
1、基本的cpp文件编译及链接指令
// main.cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout<<"this is a g++ test"<<endl;
return 0;
}
g++ main.cpp
生成的文件为以默认名字生成的输出文件a.out, ./a.out 执行,可打印出:this is a g++ test
指定生成的文件名称: -o file(将文件编译为file,file可以是预处理文件/汇编文件/目标文件或者最终的可执行文件)
g++ main.cpp -o main
生成main,./main 执行,结果与上述一样
只编译不链接:-c (生成.o的二进制文件)
rm main
g++ -c main.cpp
生成main.o文件,
再执行g++ main -o main
生成main可执行文件,./main, 执行结果相同
预编译:-E (把所有的关文件,宏等拼接至一个文件内)
rm main main.o
g++ -E main.cpp > main.e
main.e文件内即可预编译的文件
只编译不汇编:-S
rm main.e
g++ -S main.cpp
main.s文件内即可编译后的汇编代码
带调试的可执行文件:-g
rm main.s
g++ -g main.cpp -o main_d
2、多文件编译
目录结构
src/
person/ Person.h, person/Person.cpp
test/ main.cpp
文件内容如下// main.cpp
#include "Person.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
Person person;
cout<<"test main"<<endl;
return 0;
}
// Person.h
class Person
{
public:
Person();
};
// Person.cpp
#include "Person.h"
#include <iostream>
Person::Person()
{
std::cout<<"MultiFile compilation"<<std::endl;
}
test目录下编译
g++ main.cpp ./person/Person.cpp -I../person -o main
执行:
./main
3、动态链接库
指令 :g++ cppfiles -fpic -shared -o libname.so
上面的命令行中-shared表明产生共享库,而-fPIC则表明使用地址无关代码。PIC:Position Independent Code.
person目录下编译
g++ Person.cpp -fpic -shared -o libPerson.so
test目录下编译
g++ main.cpp -o main -I../person -L../person -lPerson
-L表示链接目标的文件路径,-lPerson为链接库的名称
执行
首先设置环境
export LD_LIBRARY_PATH=../person
./main
输出内容:
MultiFile compilation
test main