2017-02-16 63 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和