我将我的可执行文件与第三方静态库链接起来,该库使用传递给C编译器的错误定义进行编译。 同一个库也可以作为一个DLL来使用,并且静态版本被编译成所有符号都被导出。 这对静态库当然是没有意义的,因为导出会传播到可执行文件(或DLL)中,这样的库将被集成到其中。
当我将该可执行文件链接到该库时,库中的符号将从可执行文件中导出。 我不关心生成的.lib和.exp文件。 我需要摆脱可执行文件中的导出符号。
我需要的是以下两种方式之一:
强制链接器的导出符号列表被清除,或者
编辑从库中提取的对象文件以“取消”导入符号。
我正在使用Visual Studio 2012来构build项目。 该库以.LIB文件的forms提供,我可以使用该库pipe理器来提取目标文件和dumpbin以确认是否存在导出的符号。
目前我不想打扰供应商来解决问题,或者说,我不希望他们在我变老之前回复。
要完全覆盖从链接期间创建的PE映像(.exe或.dll)导出的符号,必须链接.exp
文件。 仅使用.def
文件进行链接只能将符号添加到导出的列表中,而不能从中删除。
创建一个.def
文件。 如果你不想出口任何东西,那几乎是空的:
NAME "YourExecutableBaseName"
这将为YourExecutableBaseName.exe
或YourExecutableBaseName.dll
。 .def
的基本名称应与链接器的输出文件名相匹配,否则会有警告。
使用LIB
从.def
文件创建一个.exp
文件。
将可执行文件与这个.exp
文件链接起来 。 这个导出文件完全定义了任何和所有导出的符号,链接器不会导出任何不存在的东西。