編譯 GCC 連線順序

2021-08-08 11:52:40 字數 1284 閱讀 3863

當使用兩個靜態庫存在依賴的時候,連線的時候可能會遇」undefined reference to」問題。

這裡我們使用a.c b.c main.c 來說明:

// acall.h

#ifndef __acall_h__

#define __acall_h__

int acall( int a, int b);

#endif

// bcall.h

#ifndef __bcall_h__

#define __bcall_h__

#include "acall.h"

int bcall( int a, int b);

#endif

// acall.c

int acall( int a, int b)

// bcall.c

#include "bcall.h"

int bcall( int a, int b)

// main.c

#include

#include "bcall.h"

int main()

編譯連線:

gcc -g

-fpic

-c acall.c -o a.o

gcc -g

-fpic

-c bcall.c -o b.o

gcc -g

-c main.c -o main.o

ar r liba.a a.o

ar r libb.a b.o

gcc main.o -o main -la

-lb-l

.

編譯報錯:

./libb.a(b.o): in function `bcall':

bcall.c:4: undefined reference to `acall'

collect2: error: ld returned 1 exit status

這是因為連線的時候尋找函式的symbol link 是從左向右的庫裡面搜尋。因此需要修改編譯指令為:

gcc main.o -o main -lb -la -l.

同時,gcc提供了額外的編譯選項 -xlinker用於解決不清楚依賴關係下的庫編譯,使用方式如下:

gcc -o main6 main.o -xlinker "-(" liba.a libb.a -xlinker "-)" -l.

GCC編譯連線

引數 e 可以完成程式的預處理工作而不進行其他的編譯工作。gcc e o a.cxx a.c 輸入下面的命令,檢視經過預處理以後的a.cxx 檔案。vim a.cxx 引數 s 可以控制gcc 在編譯c 程式時只生成相應的匯程式設計序檔案,而不繼續執行後面的 編譯。下面的命令,可以將本章中的c 程式...

gcc編譯,ld連線

編寫乙個hello world的簡單程式 hello.c 1 include2 3 intmain void 4 直接編譯很簡單 gcc o hello.o hello.c 但是如果使用gcc編譯,然後使用ld連線,就會出錯 gcc c o hello.o hello.c ld o hello he...

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...