链接库没有头文件?

时间:2012-08-07 18:56:37

标签: c++ visual-studio-2010 mfc linker static-linking

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

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

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

4 个答案:

答案 0 :(得分:12)

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

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

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

如果函数不在符号表中 - 那么它已在lib中静态定义,并且不可访问。然后你被软管了。没有办法。

答案 1 :(得分:0)

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

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

void __stdcall foo( int );

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

例如,如果您想要调用timeGetTime并且由于某些冲突而有理由不包含mmsystem.h,则可以执行此操作:

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