【问题标题】:Linking library without a header file?没有头文件的链接库?
【发布时间】:2012-08-04 20:14:46
【问题描述】:

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

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

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

【问题讨论】:

  • 函数默认有外部链接,所以extern是多余的。你确定函数是从库中导出的吗?你确定他们有你期望的调用约定(即不是extern C)吗?
  • @eli 您链接到的一篇长文章。您指的是哪种技术?
  • @quamrana 它大约下降了三分之一,在“拖放方法”下的第二段。没有标题的链接只是简单地提到。
  • @eli 我明白了。基本上你需要一个头文件链接到提供的库。如果你没有官方头文件,你可以自己写,猜测函数签名。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常准确的答案。除非所需的函数原型明确包含 MFC 对象(例如CString)。
  • 解决了我询问的问题,不幸的是,如果不将 MFC 库引入当前项目,我似乎无法引入库。感谢您的帮助。
【解决方案2】:

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

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

void __stdcall foo( int );

确保调用约定正确,它可能与__stdcall 不同。此外,您可能需要添加 extern "C" 以防止名称混淆。

【讨论】:

  • 这是我希望我不会听到的答案。我认为静态链接库的美妙之处在于它们是“完整”的代码集合,无需添加其他库作为依赖项(例如 MFC)。
  • @eli 不幸的是,库依赖于其他库是很常见的,无论是静态的还是动态的。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2015-11-14
      • 2013-10-21
      相关资源
      最近更新 更多