Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在静态库(.a文件)中自动选择.o文件_Linux_Static Libraries_Ld - Fatal编程技术网

Linux 在静态库(.a文件)中自动选择.o文件

Linux 在静态库(.a文件)中自动选择.o文件,linux,static-libraries,ld,Linux,Static Libraries,Ld,我正在开发一个静态库(libfb.a)文件,其中包含两个函数的多个实现: c包含void foo(){…} c包含void bar(){…} c包含void foo(){…}和void bar(){…} 所有3种实现(…)都是不同的,因为如果同时需要foo和bar,它们可以更高效地实现,并相互使用 如何将.o文件组合成.a文件,GNU ld将自动选择该文件,即gcc prog.c libfb.awill 如果prog.c调用foo而不是bar,则在libfb.a中使用foo.o 如果pro

我正在开发一个静态库(libfb.a)文件,其中包含两个函数的多个实现:

  • c包含
    void foo(){…}
  • c包含
    void bar(){…}
  • c包含
    void foo(){…}
    void bar(){…}
所有3种实现(
)都是不同的,因为如果同时需要foo和bar,它们可以更高效地实现,并相互使用

如何将.o文件组合成.a文件,GNU ld将自动选择该文件,即gcc prog.c libfb.awill

  • 如果prog.c调用foo而不是bar,则在libfb.a中使用foo.o
  • 如果prog.c调用bar而不是foo,则在libfb.a中使用bar.o
  • 如果prog.c同时调用foo和bar,则将foobar.o与libfb.a一起使用

我试着用弱符号和弱别名来做,但没用。也许这是不可能的。有什么办法吗?

重复@A.Monti的评论作为答案


这是不可能的。您无法检测prog.c何时使用可用的原语调用foo和bar。

这是不可能的,您无法根据彼此定义符号(例如,当
prog.c
同时使用两个符号时更改链接)。另外,静态库只是一个
.o
文件集合。@a.Monti:只使用foo.c和foobar.c(无bar.c),使用弱别名和.o文件与.a文件的正确顺序,确实可以解决这个问题。如果这是可能的,那么foo.c+bar.c+foobar.c也是可能的。事实上,您可以使用符号弱点来定义优先级,但您无法检测何时使用可用的原语“prog.c同时调用foo和bar”