4

假设我将我的应用程序与两个静态库链接。在这两个库中,我们都可以找到名称相同但功能不同的函数,这会导致符号冲突。我常用的方法 - 编辑库的源代码并为每个函数的名称添加唯一的前缀。但我不想再手动执行此操作了。是否有一些工具或智能方法可以为所选源文件中的所有函数添加自定义前缀?我使用 Visual Studio 2010 在 linux 和 windows 上工作,因此我可以在这两个平台中的任何一个平台上使用此类工具。

4

2 回答 2

1

好吧,我找不到你的工具,所以我给你写了一个。无论如何,我想学习Ruby。

#!/usr/local/bin/ruby -w

while file = ARGF.read do
  methodNames = file.scan(/\w+ (\w*) ?\([\w ,]*\);/).flatten;

  methodNames.each { |methodName|
    file.gsub!(methodName, "prefix"+methodName)}
end

您应该能够从命令行运行它并将所有源文件作为选项提供给它。它将获取文件顶部声明的所有方法名称,并通过源代码为它们添加前缀“prefix”。

如果愿意,您可以更改脚本中的前缀,或者弄清楚如何为其提供选项和文件名。

例如,如果您将其保存在名为“prefixer.rb”的 ruby​​ 文件中,您将能够从命令行调用它,如下所示:

prefixer.rb source1.c source2.c 

或者可能

prefixer.rb *.c

希望对您有用,如果您使用它,请告诉我。

于 2013-10-30T20:15:59.010 回答
1

通常,更改库中的函数签名是一个非常糟糕的主意。特别是如果您正在使用预先存在的代码库。如果其他人正在使用该功能,您将破坏他们的代码。

即使这只是您自己的项目,您也可能不应该养成这种习惯。

为什么不完全指定冲突的功能?而不是仅仅让使用 Library1; 使用库2;处理它,您可以尝试在模棱两可的情况下明确指定 Library1.Function1() 。

编辑:啊,我以为我看到了 C++,如果没有命名空间,这个答案是完全无效的。 这可能会有所帮助

Edit2: objcopy 似乎通过仅在临时副本前面加上前缀来解决破坏他人签名的问题。Mathias 发布的链接有完整的解释,我将在此处重新链接以方便查看

于 2013-10-29T16:52:45.447 回答