在 C++ 中编译 C 库。链接问题。 MuPDF
Compiling C library in C++. Linking issue. MuPDF
我尝试了多个 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
我在我的应用程序中只使用了三个函数。我检查了 libs 和 headers 链接,我也设置了我的项目调试、x64、/MDd,但我得到了相同的结果。
老实说,我在任何一个库中都找不到这三个函数。我不是编程专家,但我知道应该在库中找到函数字符串,不是吗?在我的案例中,这个错误是什么意思?
您的 link 用户未能找到 mupdf 的导入库,或者您的名称 mangling/decoration 类型有问题。
下载并构建 mupdf 后,应该会有一个导入库供您 link 使用。你 link 喜欢吗?在链接器 >> 输入 >> 附加依赖项下查看您的项目 linker 设置。您是否添加了这样的导入?
没有的话加进去,应该不难找。它可能就在您下载(或构建)的 mupdf DLL 旁边。
假设您已经添加了它,下一步就是验证您是否正确找到了它。查看构建输出。你收到警告了吗?不,将 Linker >> General >> Show Progress 更改为 "Display all progress messages" 并重新构建。是否有关于库或函数的警告?
我能想到的最后一种可能性是 DLL 实际上将其函数导出为 C++(即带有名称修饰),而不是 extern "C"。在那种情况下,您的 extern "C" 括号不属于那里。或者反之亦然(即你可能在你#include 它的所有地方都没有使用 extern "C" )。我可以看到您的示例使用了它,但这是所有地方吗?
如果您正在构建 mupdf.DLL,请确保它的构建方式和调用约定与您的客户端代码相同。
我尝试了多个 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
我在我的应用程序中只使用了三个函数。我检查了 libs 和 headers 链接,我也设置了我的项目调试、x64、/MDd,但我得到了相同的结果。 老实说,我在任何一个库中都找不到这三个函数。我不是编程专家,但我知道应该在库中找到函数字符串,不是吗?在我的案例中,这个错误是什么意思?
您的 link 用户未能找到 mupdf 的导入库,或者您的名称 mangling/decoration 类型有问题。
下载并构建 mupdf 后,应该会有一个导入库供您 link 使用。你 link 喜欢吗?在链接器 >> 输入 >> 附加依赖项下查看您的项目 linker 设置。您是否添加了这样的导入?
没有的话加进去,应该不难找。它可能就在您下载(或构建)的 mupdf DLL 旁边。
假设您已经添加了它,下一步就是验证您是否正确找到了它。查看构建输出。你收到警告了吗?不,将 Linker >> General >> Show Progress 更改为 "Display all progress messages" 并重新构建。是否有关于库或函数的警告?
我能想到的最后一种可能性是 DLL 实际上将其函数导出为 C++(即带有名称修饰),而不是 extern "C"。在那种情况下,您的 extern "C" 括号不属于那里。或者反之亦然(即你可能在你#include 它的所有地方都没有使用 extern "C" )。我可以看到您的示例使用了它,但这是所有地方吗?
如果您正在构建 mupdf.DLL,请确保它的构建方式和调用约定与您的客户端代码相同。