當使用兩個靜態庫存在依賴的時候,連線的時候可能會遇」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 編譯。...