如何从VC8中的2个静态库中获取所有符号冲突

时间:2011-06-09 07:16:35

标签: c visual-studio visual-studio-2005 static-libraries static-linking

说我有2个静态库

ex1.a ex2.a

在两个库中,我将定义10个相同的函数

编译示例测试代码时说“test.c”,我链接静态库ex1.a和ex2.a

在“test.c”中我只会调用3个函数,然后我会得到 链接器错误“在ex1.a和ex2.a库中都定义了相同的符号”这是好的。

我的问题是: 1.为什么这个错误只显示3个函数作为多个定义..为什么不列出所有10个函数

  1. 在VC8中如何列出所有多个已定义的符号,而无需在测试代码中实际调用该函数...
  2. 谢谢,

2 个答案:

答案 0 :(得分:0)

那是因为,链接器在编译并链接具有函数调用的代码时会尝试重新调整符号名称。只有当代码有一些函数调用时,链接器才会尝试在测试代码或链接的库中解析它,以及它何时会找到多个定义。如果没有调用函数,那我猜没问题。

答案 1 :(得分:0)

您所体验的是链接器的优化部分:默认情况下,它不包含未引用的代码。编译器将创建多个目标文件,其中很可能是未解析的依赖项(包含的代码无法满足调用)。因此,链接器会传递所有传递的目标文件,并尝试为未解析的依赖项找到解决方案。如果失败,它将检查可用的库文件。如果有多个选项具有相同的确切名称/签名,它将开始抱怨因为它将无法决定选择哪一个(对于相同的代码,这无关紧要,但想象使用不同的“幕后”工作的不同实现在内存上,例如调试和发布内容。)

我能想到检测所有这些多个定义的唯一(也可能是最简单的方法)是创建另一个静态库项目,包括在两个静态库中使用的所有源文件。创建库时,链接器将包含所有调用或导出的内容 - 只要导出链接器,就不需要特定的代码调用链接器查看/包含所有内容的内容。

但是我仍然不明白你实际上要完成的是什么。试图找到两个库之间共享的代码?