假设我将我的应用程序与两个静态库链接起来。在这两个库中,我们可以找到具有相同名称但功能不同的函数,这会导致符号冲突。我通常的方法 - 编辑库的源代码并为每个函数的名称添加唯一的前缀。 但我不想再手动这样做了。是否有一些工具或智能方法为所选源文件中的所有功能添加自定义前缀?我使用Visual Studio 2010在linux和windows上工作,所以我可以在这两个平台中的任何一个上使用这样的工具。
答案 0 :(得分:1)
一般来说,更改库中的函数签名是一个非常糟糕的主意。特别是如果您在预先存在的代码库中工作。如果其他人正在使用该功能,您将破坏他们的代码。
即使这只是你自己的项目,你也可能不应该养成这种习惯。
为什么不完全指定碰撞的功能?而不只是让使用Library1;使用Library2;处理它,您可能会尝试在不明确的情况下显式指定Library1.Function1()。
编辑:啊,我以为我看过C ++,没有命名空间,这个答案完全无效。 This might help thoughEdit2:objcopy似乎通过仅为临时副本添加前缀来解决打破其他人签名的问题。 Mathias发布的链接有完整的解释,我将重新链接here以获取可见性
答案 1 :(得分: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
您应该能够从命令行运行它并将其作为选项提供给所有源文件。它将在文件顶部声明所有方法名称,并通过前缀“前缀”的源代码。
如果您愿意,可以在脚本中更改前缀,或者弄清楚如何提供选项以及文件名。
例如,如果将其保存在名为“prefixer.rb”的ruby文件中,您将能够从命令行中调用它,如下所示:
prefixer.rb source1.c source2.c
或者可能
prefixer.rb *.c
希望能为你做到,如果你使用它,请告诉我。