我正在将我的可执行文件与第三方静态库链接,该库是使用传递给 C 编译器的错误定义进行编译的。相同的库也可以作为 DLL 提供,并且编译静态版本以便导出所有符号。这对于静态库来说当然没有意义,因为导出传播到可执行文件(或 DLL),这样的库将集成到其中。
当我将可执行文件与该库链接时,该库中的符号将从可执行文件中导出。我不关心生成的 .lib 和 .exp 文件。我需要删除可执行文件本身中导出的符号。
我需要的是一种方法:
强制清除链接器的导出符号列表,或者
编辑从库中提取的目标文件以“取消导出”符号。
我正在使用 Visual Studio 2012 来构建该项目。该库以 .LIB 文件形式提供,我可以使用库管理器提取目标文件和 dumpbin 来确认导出符号的存在。
目前我不想麻烦供应商来修复它,或者更确切地说,我不希望他们在我变老之前回复。
最佳答案
要完全覆盖从链接过程中创建的 PE 镜像(.exe 或 .dll)导出的符号,必须链接到 .exp
文件。只是linking with a .def
file只能将符号添加到导出列表中,而不能从其中删除。
创建
.def
文件。如果您不想导出任何内容,它将几乎为空:NAME "YourExecutableBaseName"
这适用于
YourExecutableBaseName.exe
或YourExecutableBaseName.dll
。.def
中的基本名称应与链接器的输出文件名匹配,否则会出现警告。使用
LIB
从.def
文件创建.exp
文件。Link the executable with this
.exp
file 。此导出文件完全定义了所有导出的符号,链接器不会导出不存在的任何内容。
关于windows - 如何删除 Windows 静态库中导出的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040437/