如何摆脱从Windows静态库导出的符号?

我将我的可执行文件与第三方静态库链接起来,该库使用传递给C编译器的错误定义进行编译。 同一个库也可以作为一个DLL来使用,并且静态版本被编译成所有符号都被导出。 这对静态库当然是没有意义的,因为导出会传播到可执行文件(或DLL)中,这样的库将被集成到其中。

当我将该可执行文件链接到该库时,库中的符号将从可执行文件中导出。 我不关心生成的.lib和.exp文件。 我需要摆脱可执行文件中的导出符号。

我需要的是以下两种方式之一:

  1. 强制链接器的导出符号列表被清除,或者

  2. 编辑从库中提取的对象文件以“取消”导入符号。

我正在使用Visual Studio 2012来构build项目。 该库以.LIB文件的forms提供,我可以使用该库pipe理器来提取目标文件和dumpbin以确认是否存在导出的符号。

目前我不想打扰供应商来解决问题,或者说,我不希望他们在我变老之前回复。

要完全覆盖从链接期间创建的PE映像(.exe或.dll)导出的符号,必须链接.exp文件。 仅使用.def文件进行链接只能将符号添加到导出的列表中,而不能从中删除。

  1. 创建一个.def文件。 如果你不想出口任何东西,那几乎是空的:

     NAME "YourExecutableBaseName" 

    这将为YourExecutableBaseName.exeYourExecutableBaseName.dll.def的基本名称应与链接器的输出文件名相匹配,否则会有警告。

  2. 使用LIB.def文件创建一个.exp文件。

  3. 将可执行文件与这个.exp文件链接起来 。 这个导出文件完全定义了任何和所有导出的符号,链接器不会导出任何不存在的东西。