我将我的可执行文件链接到第三方静态库,该库是使用传递给C编译器的错误定义编译的。同一个库也可用作DLL,并编译静态版本以便导出所有符号。这当然对静态库没有意义,因为导出会传播到可执行文件(或DLL),这样库就会被集成到。
当我将可执行文件与此库链接时,库中的符号将从可执行文件中导出。我并不关心生成的.lib和.exp文件。我需要摆脱可执行文件中的导出符号。
我需要的是一种方法:
强制清除链接器的导出符号列表,或
编辑从库中提取的目标文件,以“取消”符号。
我正在使用Visual Studio 2012来构建项目。该库以.LIB文件的形式提供,我可以使用库管理器提取目标文件和dumpbin以确认是否存在导出的符号。
目前我不想打扰供应商来解决它,或者说,我不希望他们在我老去之前回复。
答案 0 :(得分:1)
要完全覆盖从链接期间创建的PE映像(.exe或.dll)导出的符号,必须链接.exp
文件。仅linking with a .def
file只能将符号添加到导出的列表中,而不能从中删除。
创建.def
文件。如果您不想导出任何东西,它几乎是空的:
NAME "YourExecutableBaseName"
这适用于YourExecutableBaseName.exe
或YourExecutableBaseName.dll
。 .def
中的基本名称应与链接器的输出文件名匹配,否则会出现警告。
使用.exp
从.def
文件创建LIB
文件。
Link the executable with this .exp
file。此导出文件完全定义任何和所有导出的符号,链接器不会导出任何不存在的符号。