如果Windows中已存在Visual C ++,则丢弃.lib文件的符号

时间:2011-03-17 17:27:13

标签: windows visual-c++ linker

在链接源代码时是否可以丢弃.lib文件的现有符号?

例如,我有一个.lib文件,它使用多个源文件和一个包含函数的 source1.cpp 文件进行编译: void function1()。 /> 我有一个包含多个文件的项目,并且他的一个文件是相同的 source1.cpp (因此也包含相同的功能)但已被修改。
那么是否可以将lib文件链接到我的项目,以便考虑我的项目的源文件和函数,而不是.lib文件的源文件和函数?

我想用Visual C ++做到这一点 目前,当我这样做时,我得到了已经定义的常见错误符号......

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

这不应该发生,.lib中的.obj只在需要时被拉入。尝试在代码中编写strcpy(),即使它也存在于CRT库中,也没有链接错误。

确保您不需要存储在.lib中的source1.obj中的部分函数。您可以使用/ verbose链接器选项进行诊断。项目+属性,链接器,命令行,附加选项框。它会显示从.lib中提取的符号,搜索source1.obj。一旦它被使用,如果名称冲突,会得到链接器错误。这当然容易出错,最好避免。

答案 1 :(得分:0)

没有。你应该使符号不同。也就是说,项目source1.cpp中的function1应该与库中的名称不同。

在不了解情况的情况下,您可能希望通过将库或项目放入命名空间来实现此目的。

// lib/source1.h
namespace mylib {
  void function1();
}

// lib/source1.cpp
namespace mylib {
  void function1() {
    ...
  }
}

// project/source1.h
namespace myproj {
  void function1();
}

// project/source1.cpp
namespace myproj {
  void function1() {
    ...
  }
}

现在,您可以在代码中致电myproj::function1()mylib::function1()。那些符号将是截然不同的。如果您总是使用一个而不是另一个,链接器可能会丢弃未使用的链接(至少在优化的构建中)。

如果您不想更改代码中的所有调用,可以添加类似using myproj::function1()的行,这将告诉编译器当您说function1()时,您的意思是来自您的{{1}}项目