Visual Studio 2008链接器希望解析所有符号,而不仅仅是已使用的符号

时间:2010-05-17 12:16:59

标签: c visual-studio-2008 linker

我们最近从2005年升级到Visual Studio 2008,我认为这些错误在此之后开始。

在我们的解决方案中,我们有很多项目。其中许多是实用程序项目,或包含其他项目使用的核心功能的项目。它们的输出是lib文件,它们在构建使用“Project dependencies ...”选项生成最终二进制文件的项目时链接。

其他项目之一---让我们称之为ResultLib ---生成一个DLL,它需要核心项目中的一个单一功能。这个函数只使用自己的源文件中的静态函数,但整个项目使用了很多低级Windows函数,并且还导入了一个DLL ---我们称之为Driver.dll。

我们的问题是,在构建ExtLib时,链接器会抱怨大量未解析的外部因素,例如从Driver.dll导出的所有函数,因为链接时未指定其lib文件。如果我们尝试通过添加使用所有核心项目的其他项目使用的所有lib文件来解决这个问题,那么我们生成的ResultLib DLL最终导入Driver.dll并导出其中定义的所有函数。

我们如何告诉Visual Studio只尝试解析实际使用的符号?

2 个答案:

答案 0 :(得分:0)

您的libs对象可能不够精细。如果访问库中的函数,则包含同一目标文件中的任何其他函数,根据定义,需要解析它们调用的任何函数。让我们举一个例子:

我的库中有三个函数,f1,f2和f3。 函数f1和f2在同一个源文件中(因此最终会在同一个目标文件中)。函数f3位于单独的文件中。

如果我的应用程序调用f3,链接器将只包含f3的代码。如果我的应用程序调用f1或f2,则链接器将始终包含用于函数的代码。

这就是为什么有些库项目最终会有很多小的源文件。

答案 1 :(得分:0)

好吧,似乎我错误地认为链接器足够聪明,可以在最终链接之前删除未使用的符号。

我必须做的是手动从构建中排除所有不必要的文件。对于列为DLL项目的依赖项的所有项目。哎呀。