没有头文件的链接库

Linking library without a header file?

本文关键字:链接 文件      更新时间:2023-10-16

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

但是,我没有运气。无论我尝试什么,我都得到一个未解决的外部符号错误。

文章正确吗?如果不是,这种联系是否可能以其他方式出现?

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

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

如果函数名称看起来正常 - 则定义它,并使用"extern C"链接到它。如果符号是 c++ 残缺的,那么你需要解开它才能找到原型。

如果函数不在符号表中 - 则它已在库中静态定义,并且不可访问。然后你就被灌了。没有办法。

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

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

void __stdcall foo( int );

确保调用约定正确,它可能与__stdcall不同。此外,您可能必须添加extern "C"以防止名称重整。

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

如果您需要的函数

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

例如,

如果你想要调用timeGetTime,并且由于一些冲突而有理由不包括mmsystem.h,你可以这样做:

extern "C" DWORD WINAPI timeGetTime(void);
#pragma comment(lib, "winmm.lib")