2017-02-16 61 views
0

我正在開發其中包含兩個功能的多種實現靜態庫(libfb.a)文件的.o文件:自動選擇靜態庫(某文件)

  • foo.c中包含void foo() { ... }
  • bar.c包含void bar() { ... }
  • foobar.c包含void foo() { ... }void bar() { ... }

所有3個實現(...)是不同的,因爲如果需要兩者FOO酒吧,它們兩者可以更有效地實施,使用彼此。

我怎樣才能.o文件合併到某文件針對GNU勞工處會做自動選擇,即gcc prog.c libfb.a將libfb.a內

  • 使用foo.o的,如果prog.c中調用FOO,但不是bar;
  • 在libfb.a中使用bar.o如果prog.c調用bar,但不是foo;
  • 使用foobar.o與libfb.a如果prog.c中同時呼籲酒吧

我試圖使用弱符號和弱別名做到這一點,但沒有奏效。也許這是不可能的。任何想法如何做到?

+0

這是不可能的,你不能相互定義符號(例如,當'prog.c'使用* both *符號時,改變鏈接)。 另外,一個靜態庫只是一個'.o'文件集合[在一個檔案中](https://en.wikipedia.org/wiki/Ar_(Unix))。 –

+0

@ A.Monti:只用foo.c和foobar.c(no bar.c)就可以解決這個問題,它使用弱別名和.o文件與.a文件的正確排序。如果可能的話,也許foo.c + bar.c + foobar.c也是可能的。 – pts

+0

嗯,的確,你可以使用符號弱點來定義優先級,但是你根本無法使用可用的基元來檢測「prog.c調用**兼有** foo和bar」 –

回答

0

重複@ A.Monti的評論作爲答案。

這是不可能的。您無法檢測prog.c何時使用可用的基元調用foo和