Macos 我如何告诉链接器使用一个方法的多个实现中的哪一个? 我使用一个工具生成一个111k行长C++类实现。它生成的方法可以正常工作,但它们往往会在所使用的API中触发一条缓慢的路径

Macos 我如何告诉链接器使用一个方法的多个实现中的哪一个? 我使用一个工具生成一个111k行长C++类实现。它生成的方法可以正常工作,但它们往往会在所使用的API中触发一条缓慢的路径,macos,linker,clang,Macos,Linker,Clang,使用Mac OS X上的Clang,我是否可以在不同的源文件中手动实现一些最常用的方法,并告诉链接器(或任何其他相关程序)忽略工具生成的方法(如果存在该方法的其他实现) 我完全控制着工具的输出,尽管很难自动生成更好的代码。工具生成的方法需要标记为弱外部。在GCC中,使用\uuuuu属性((弱导入))发出声音。然后,如果您手工制作的等价物是强外部(默认情况下是强外部),则它们将优先于生成的。如果代码是在库中交付的,则链接器将搜索连续库中的.o文件,直到满足所有未解析的符号。因此,如果您的代码生成可

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


我完全控制着工具的输出,尽管很难自动生成更好的代码。

工具生成的方法需要标记为弱外部。在GCC中,使用
\uuuuu属性((弱导入))
发出声音。然后,如果您手工制作的等价物是强外部(默认情况下是强外部),则它们将优先于生成的。

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


或者,如果您可以在代码中添加一个错误的模板,那么您可以为代码指定一个显式的专门化。这将是编译器/链接器使用的,因为它是一个特定的专门化。< /P>是你用来生成111K行长C++类实现的工具?它是我制作的工具,它是LLVM IR模块,并将其转换成C++代码,其中模块函数和C++方法之间有1:1映射。每种方法都会生成匹配函数的IR,参数不变的情况除外,因此代码可以很容易地进行专门化和优化,然后进行分析。它有一个非常特殊的用途。它是脏的,但是如果该工具正在生成足够的模块化代码,那么相关的“更高效”标题的
\include\u next
会在不太头疼的情况下执行此操作。@CodaFi,我不确定我是否理解您的解决方案。我的想法是手动指定一个更高效的实现,而不是一个更高效的声明。这个想法是,考虑到该工具和您可以生成两个不同的头(或更多),您可以将函数的实现分解为不同的头,并且#包括#下一步,当您觉得某个特定的实现在应用程序中更值得时“高效”标题,而不是“生成工具”“一个。是的,这不是一个链接时间的变化,这是一个CPP的变化,但我宁愿有模块化,而不是用DYLD。我知道你可以使用
weak\u import
进行外部,但我不知道你可以对在可执行文件中静态链接的方法这样做。我尝试了,但得到了
X::y
的重复符号错误。如果该方法是静态链接的,为什么会有区别?我的假设是弱导入依赖于dyld使用空指针填充PLT/get条目,以及静态链接的符号,而这些符号不是导入,不需要这种间接性,因此也就没有被抵消的机会。除此之外,我不认为
弱导入
意味着符号被合并。这些符号类在上进行了描述。链接器将抱怨.a方法中存在多个符号定义,除非其中存在技巧。它选择库中的.o文件以满足每个依赖项。因此,如果一个.o文件包含多个项目,则链接器会投诉。但是,如果每个方法都位于不同的.cpp文件中,那么它将位于单独的.o文件中,并且链接器将只添加未满足的符号。如果您可以将弱方法编码到一个.o文件中,那么这就足够了。我没有意识到链接器只会从.a中获取它需要的符号,并且重复的符号会被悄悄地丢弃。