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