如何告诉链接器使用哪种方法实现?

时间:2015-07-26 01:43:49

标签: macos linker clang

我使用工具生成111k行的C ++类实现。它生成的方法可以正常工作,但它们往往会触发它们使用的API的慢速路径。

对于Mac OS X上的Clang,我有什么办法可以在不同的源文件中手动实现一些最常用的方法,并告诉链接器(或任何其他相关程序)忽略工具生成的方法如果该方法的另一个实现存在?

我可以完全控制工具的输出,但是自动生成更好的代码会非常困难。

2 个答案:

答案 0 :(得分:2)

如果代码在库中传递,则链接器将搜索连续库中的.o文件,直到满足所有未解析的符号。因此,如果您的代码生成可以确保将弱代码分成不同的.cpp文件,那么您可以在链接路径上的早期.a中提供自定义编写的版本,这将在代码生成提供的.a之前使用。

或者,如果您可以在代码中添加假模板,则可以为代码指定显式特化。这将由编译器/链接器使用,因为它是特定的特化。

答案 1 :(得分:1)

工具生成的方法需要标记为弱外部。在GCC和clang this is achieved__attribute__((weak_import))。然后,如果您手工制作的等效物是强外部物(默认情况下是这样),它们将优先于生成的物体。