2012-07-06 49 views
2

我是Linux gcc的新手。我正在編寫一個簡單的代碼來學習Linux gcc中的弱屬性。弱的屬性只能在Linux GCC的共享庫中工作嗎?

查看我的示例代碼:

weakref.c,主文件。我希望該文件可以在有或沒有foo方法被定義的情況下工作。

#include <stdio.h> 
extern void foo(void) __attribute__((weak)); 

int main() { 
    if (foo){ 
    foo(); 
    printf ("foo is defined\n"); 
    } else { 
    printf("foo is not defined\n"); 
    } 
} 

所以,我運行下面的命令來編譯並運行它:

gcc weakref.c -o main_static 
./main_static 

,輸出是「富沒有定義」,這是我所期待的。

然後創建一個新的文件libfoo.c,見下圖:

#include <stdio.h> 

void foo() { 
    printf("Print in foo.\n"); 
} 

我試圖3種方式,以儘量使主檔案工作與libfoo.c:

  1. 編譯安裝libfoo .c和weakref.c並鏈接目標文件。
  2. 編譯libfoo.c作爲靜態庫,並與weakref.c
  3. 的對象文件鏈接它編譯libfoo.c作爲共享庫,並與weakref.c
  4. 的對象文件鏈接它

只有3路工程,得到下面的輸出:

Print in foo. 
foo is defined 

可否請你讓我知道如果弱裁判只有一個共享庫的作品,爲什麼?非常感謝!

回答

2

讓我知道如果弱裁判只能用共享庫

一點也不工作。

1.和3.都會產生「foo is defined」。

的2。有望拉動libfoo.olibfoo.a,因爲從weakref.o懸而未決弱引用不會從歸檔庫中拉一個對象的目的算作解決的符號。但是,您可以將強制libfoo.o拉入鏈接,如下所示:gcc weakref.o -lfoo -ufoo,然後您應該再次獲得「foo已定義」。

現在我說應該發生了,讓我們看看練習是否同意。從Linux/x86_64系統上成績單,使用gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303

$ gcc -c weakref.c libfoo.c 
$ ar ruv libfoo.a libfoo.o 
ar: creating libfoo.a 
a - libfoo.o 
$ gcc weakref.o && ./a.out 
foo is not defined 

這是你的#1:

$ gcc weakref.o libfoo.o && ./a.out 
Print in foo. 
foo is defined 

正如你可以看到1號 「作品」 如我所料,而不是你聲稱。你一定在某個地方犯了一些錯誤。

這是你的#2:

$ gcc weakref.o -L. -lfoo && ./a.out 
foo is not defined 

你的#2了,但迫使libfoo.o被拉入鏈接:

$ gcc weakref.o -L. -lfoo -ufoo && ./a.out 
Print in foo. 
foo is defined 
+0

感謝。我有#1和#2工作。 #1失敗的原因是因爲我使用ld來鏈接2個目標文件而不是gcc。 – 2012-07-07 06:06:29