Linux下g++基本的編譯

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(將文件編譯爲filefile可以是預處理文件/彙編文件/目標文件或者最終的可執行文件

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












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章