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

时间:2013-09-26 23:38:30

标签: windows visual-studio linker

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

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

我需要的是一种方法:

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

  2. 编辑从库中提取的目标文件,以“取消”符号。

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 创建.def文件。如果您不想导出任何东西,它几乎是空的:

    NAME "YourExecutableBaseName"
    

    这适用于YourExecutableBaseName.exeYourExecutableBaseName.dll.def中的基本名称应与链接器的输出文件名匹配,否则会出现警告。

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

  3. Link the executable with this .exp file。此导出文件完全定义任何和所有导出的符号,链接器不会导出任何不存在的符号。