12

我正在尝试使用 Visual Studio 2010 链接 C++ 中的静态库。麻烦的是,库(和随附的标头)中有很多 MFC 对象。我想在不重新编译我的项目以包含 MFC 或重新编译库以不使用 MFC 的情况下调用库的函数之一。这篇codeproject 文章似乎暗示如果我在项目中将函数定义为外部函数(使用“extern”关键字),这是可能的。

然而,我没有运气。无论我尝试什么,我都会收到未解决的外部符号错误。

文章是否正确?如果没有,这种联系是否可能以任何其他方式进行?

4

4 回答 4

13

你完全可以做到这一点,你只需要找到正确的函数原型。

使用“dumpbin”转储符号表,并查找您的函数。

如果函数名看起来正常 - 然后定义它,并使用“extern C”链接到它。如果符号是 c++ 损坏的,那么您将需要对其进行解构以找到原型。

如果该函数不在符号表中 - 那么它已在库中静态定义,并且不可访问。那你就完蛋了。没有办法。

于 2012-08-07T19:07:57.517 回答
0

如果您要调用的函数使用 MFC 位,您还必须将 MFC 支持添加到您的项目中。但是,如果不是,并且函数已由库导出,您只需将函数的原型添加到要调用它的文件中,然后将库链接到可执行文件。

例如,您将在调用导出函数的文件中添加这样的一行:

void __stdcall foo( int );

确保你得到正确的调用约定,它可能不同于__stdcall. 此外,您可能必须添加extern "C"以防止名称损坏。

于 2012-08-07T19:08:57.837 回答
0

静态库是一个或多个编译模块的积累。每个模块都可以依赖于其他模块,其中一些模块可能在其他库中。

如果您需要的函数位于没有其他依赖项的模块中,或者其依赖项都包含在当前库中,则可以在创建适当的函数原型后链接它。如果还有其他依赖项,那么您就不走运了。

于 2012-08-07T19:23:09.293 回答
0

例如,如果您想调用 timeGetTime 并且由于某些冲突而有理由不包含 mmsystem.h,您可以这样做:

extern "C" DWORD WINAPI timeGetTime(void);
#pragma comment(lib, "winmm.lib")
于 2013-03-29T12:36:22.260 回答