我们的项目是一个基于VS2008的项目,大量使用Boost和Qt。但是,今天我们遇到了一个没有任何意义的新链接问题。
在链接期间发生的是
当我说链接器找到一些成员函数时,我所做的是链接/ VERBOSE选项。然后我去检查生成的buildlog.htm文件,我可以看到链接器在哪里找到库中的一些函数。链接器错误是“”错误LNK2019:未解析的外部“
此外,同样的事情发生在32位或64位 - 调试或发布模式。
有关何处查看的任何建议?
答案 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();
在客户端的函数。我为此使用宏:
// this should be moved to stdafx.h or something sufficiently low-level
#define MYLIB_API (declspec(__dllexport))
MYLIB_API void DoIt()
{
// magic happens
}
namespace Foo { void DoIt(); };
第2步:确保您在实施中正确 命名。我最常见的错误之一是声明类或命名空间的成员函数,比如namespace lib
{
MILIB_API void DoIt();
};
,然后忘记在实现中完全限定类或命名空间。如果您从未在实现中调用该函数,则链接器可能永远不会查找它。
MYLIB_API void DoIt()
{
// magic happens
};
MYLIB_API void mylib::DoIt()
{
// magic
}
这将生成一个未解析的外部。 CPP应如下所示:
{{1}}
第3步:确保链接到您需要链接的所有内容。这似乎更像是步骤0或步骤1,但假设您已链接到您需要的所有,此步骤可能很难。查看链接器所抱怨的名称,对它们进行一些取消,并搜索库的代码以实现这些功能。您可能会发现它们是从您认为导出的项目以外的项目中导出的。