VS2008无法链接到库中的所有函数

时间:2010-09-29 19:56:14

标签: c++ visual-studio-2008 linker

我们的项目是一个基于VS2008的项目,大量使用Boost和Qt。但是,今天我们遇到了一个没有任何意义的新链接问题。

在链接期间发生的是

  • 对于程序A,我们的静态库Foobar正在寻找8个成员函数中的5个的链接。
  • 对于程序FoobarUnitTest,所有来自Foobar的链接都运行良好。
  • 对于程序B,我们的库Foobar2是一个DLL。在链接期间,它会找到除构造函数和析构函数之外的所有成员函数。

当我说链接器找到一些成员函数时,我所做的是链接/ VERBOSE选项。然后我去检查生成的buildlog.htm文件,我可以看到链接器在哪里找到库中的一些函数。链接器错误是“”错误LNK2019:未解析的外部“

此外,同样的事情发生在32位或64位 - 调试或发布模式。

有关何处查看的任何建议?

1 个答案:

答案 0 :(得分:0)

很难为这样一个模糊的问题提供任何有意义的建议,但这里有几件事需要检查。当标题显示有一个名为“x :: y()”的函数时,链接器会报告“未解析的外部”,但它无法在lib文件中找到该函数。请记住,这假设您实际上已实现了相关功能。然而,最终,无论问题最终如何,它都会变形“你告诉我有一个名为x :: y()的函数,但是你没有实现一个名为x :: y()的函数。” / p>

因此,步骤0确保您实际已实现这些功能。好的,我们假设你有。

步骤1确保您declspec(__dllexport)在库的实现中declspec(__dllimport)函数,并#ifndef MYLIB_API # define MYLIB_API (declspec(__dllimport)) #endif MYLIB_API void DoIt(); 在客户端的函数。我为此使用宏:

MyFancyLib.h:

// this should be moved to stdafx.h or something sufficiently low-level
#define MYLIB_API (declspec(__dllexport))

MYLIB_API void DoIt()
{
  // magic happens
}

MyFancyLib.CPP:

namespace Foo { void DoIt(); };

第2步:确保您在实施中正确 命名。我最常见的错误之一是声明类或命名空间的成员函数,比如namespace lib { MILIB_API void DoIt(); }; ,然后忘记在实现中完全限定类或命名空间。如果您从未在实现中调用该函数,则链接器可能永远不会查找它。

MyLib.h:

MYLIB_API void DoIt()
{
  // magic happens
};

MyLib.cpp:

MYLIB_API void mylib::DoIt()
{
  // magic
}

这将生成一个未解析的外部。 CPP应如下所示:

MyLibCorrect.cpp:

{{1}}

第3步:确保链接到您需要链接的所有内容。这似乎更像是步骤0或步骤1,但假设您已链接到您需要的所有,此步骤可能很难。查看链接器所抱怨的名称,对它们进行一些取消,并搜索库的代码以实现这些功能。您可能会发现它们是从您认为导出的项目以外的项目中导出的。