【问题标题】:Compiling C library in C++. Linking issue. MuPDF [duplicate]用 C++ 编译 C 库。链接问题。 MuPDF [重复]
【发布时间】:2017-11-01 12:31:41
【问题描述】:

我尝试了多个 PDF 库,而 MUPDF 是我构建自己的小型 PDF 应用程序的最后机会。但在这里我也有问题。在此之前我遇到了 LNK4098: defaultlib 'MSVCRT' 的问题,但我解决了这个问题,以便为所有 MUPDF 库 /MDd 版本设置。之后大多数错误都解决了,但我仍然无法解决这个问题:

error LNK2001: unresolved external symbol "void __cdecl pdfapp_open(struct pdfapp_s *,char *,int)" (?pdfapp_open@@YAXPEAUpdfapp_s@@PEADH@Z)
//more 3 errors

作为用 C 语言编写的 MuPDF,我这样做:

extern "C" {
#include <pdfapp.h>
#include <mupdf\fitz\context.h>
}

但我得到这个错误:

error LNK2001: unresolved external symbol pdfapp_open
//more 3 errors

我在我的应用程序中只使用了三个函数。我检查了库和头文件链接,我也设置了我的项目调试、x64、/MDd,但我得到了相同的结果。 老实说,我在任何一个库中都找不到这三个函数。我不是编程专家,但我知道函数字符串应该在库中找到,不是吗?在我的情况下,这个错误是什么意思?

【问题讨论】:

  • C 和 C++ 是不同的语言。它们有一个足够大的公共子集来编写程序,但未专门编写和维护以符合这两种标准的程序很可能在一种语言或另一种语言中无效。如果您有 C 库,则使用 C 编译器构建它。在 C 模式下运行时,MSVC++ 不是符合标准的 C 编译器,在 C++ 模式下运行时,它肯定不是符合标准的 C 编译器。但是,它的 C 模式可能足以构建您的特定 C 代码,特别是如果它是旧代码。
  • @John Bollinger 我认为 extern C 必须解决 C n 和 C++ 之间的任何兼容性问题。 ((感谢您的解释。
  • 您已经发布了这个问题。这是重复的。虽然我无权查看您删除的旧问题,但如果它因重复而被关闭,那么在删除/关闭后发布相同的问题将导致禁令或其他处罚。跨度>
  • 对不起,这是新问题的新问题,不会重复。确实,我之前的问题被重复了,被删除了。
  • @hardCode,不,一点也不。 extern "C" 表示(在 C++ 中)如此声明的函数具有 C 链接。这使得将它们链接到 C 并从 C 调用它们成为可能,但这与它们的实现无关,它仍然必须符合 C++(因为 extern "C" 语法是 C++ 独有的功能)。

标签: c++ c visual-studio static-linking mupdf


【解决方案1】:

您的链接器无法找到 mupdf 的导入库,或者您有名称修饰/修饰类型问题。

下载并构建 mupdf 后,应该有一个导入库供您链接。你链接到它吗?在链接器>>输入>>附加依赖项下查看您的项目链接器设置。你添加了这样的导入吗?

如果没有,添加它。应该不难找到。它可能就在您下载(或构建)的 mupdf DLL 旁边。

假设您已添加它,下一步是验证您是否正确找到它。查看构建输出。你收到警告了吗?不,将链接器>>常规>>显示进度更改为“显示所有进度消息”并再次构建。是否有关于库或函数的警告?

我能想到的最后一种可能性是 DLL 实际上将其函数导出为 C++(即带有名称修饰),而不是外部“C”。在这种情况下,您的外部“C”括号不属于那里。或者反之亦然(即,您可能没有在所有#include 的地方都使用 extern "C")。我可以看到您的示例使用了它,但是所有的地方都这样吗?

如果您正在构建 mupdf.DLL,请确保它的构建方式和调用约定与您的客户端代码相同。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多