在链接源代码时是否可以丢弃.lib文件的现有符号?
例如,我有一个.lib文件,它使用多个源文件和一个包含函数的 source1.cpp 文件进行编译: void function1()。 />
我有一个包含多个文件的项目,并且他的一个文件是相同的 source1.cpp (因此也包含相同的功能)但已被修改。
那么是否可以将lib文件链接到我的项目,以便考虑我的项目的源文件和函数,而不是.lib文件的源文件和函数?
我想用Visual C ++做到这一点 目前,当我这样做时,我得到了已经定义的常见错误符号......
感谢您的帮助
答案 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}}项目