VC++ 使用 gumbo-query 时出现问题(链接错误)

VC++ Problems using gumbo-query (linking error)

提问人:Edge 提问时间:4/24/2015 最后编辑:CommunityEdge 更新时间:4/24/2015 访问量:982

问:

我有一个 VC++ 项目,我正在尝试使用 gumbo-query 库的扩展,可在此处找到。这个库包装/扩展了 Google 的 gumbo-parser 在这里找到。以下是我采取的确切步骤 - 我对导入库不是很熟悉,所以我已经完成了使用 Boost 库的工作:

在 Visual Studio (VS Community 2013) 中,在项目设置 -> 配置属性 -> C/C++ -> 常规 下,我已将路径放入一个文件夹,该文件夹包含来自上面链接的两个项目的所有源文件。具体来说,我将两个项目的 src 文件夹中的 .c、.cpp 和 .h 文件放在一起,并在我的项目设置中将它们引用为包含目录。

在扩展 Google 的 gumbo-parser 的项目示例文件(可在此处找到)之后,我添加了以下两行来导入库:

#include "Document.h"
#include "Node.h"

在这一点上,我的解决方案编译良好。但是,继续遵循示例文件,添加第一个变量声明:

CDocument d;

导致链接器错误,如下所示:

1>Main.obj : error LNK2028: unresolved token (0A0003B7) "public: __thiscall CDocument::CDocument(void)" (??0CDocument@@$$FQAE@XZ) referenced in function "private: void __clrcall MyApplication::Main::worker_DoWork(class System::Object ^,class System::ComponentModel::DoWorkEventArgs ^)" (?worker_DoWork@Main@MyApplication@@$$FA$AAMXP$AAVObject@System@@P$AAVDoWorkEventArgs@ComponentModel@4@@Z)
1>Main.obj : error LNK2028: unresolved token (0A0003B8) "public: virtual __thiscall CDocument::~CDocument(void)" (??1CDocument@@$$FUAE@XZ) referenced in function "private: void __clrcall MyApplication::Main::worker_DoWork(class System::Object ^,class System::ComponentModel::DoWorkEventArgs ^)" (?worker_DoWork@Main@MyApplication@@$$FA$AAMXP$AAVObject@System@@P$AAVDoWorkEventArgs@ComponentModel@4@@Z)
1>Main.obj : error LNK2019: unresolved external symbol "public: __thiscall CDocument::CDocument(void)" (??0CDocument@@$$FQAE@XZ) referenced in function "private: void __clrcall MyApplication::Main::worker_DoWork(class System::Object ^,class System::ComponentModel::DoWorkEventArgs ^)" (?worker_DoWork@Main@MyApplication@@$$FA$AAMXP$AAVObject@System@@P$AAVDoWorkEventArgs@ComponentModel@4@@Z)
1>Main.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CDocument::~CDocument(void)" (??1CDocument@@$$FUAE@XZ) referenced in function "private: void __clrcall MyApplication::Main::worker_DoWork(class System::Object ^,class System::ComponentModel::DoWorkEventArgs ^)" (?worker_DoWork@Main@MyApplication@@$$FA$AAMXP$AAVObject@System@@P$AAVDoWorkEventArgs@ComponentModel@4@@Z)
1>..{omitted}..\MyApplication.exe : fatal error LNK1120: 4 unresolved externals

无论我将 CDocument 实例化放在何处,似乎都会发生此错误。

我能做些什么来纠正这个问题?VS 似乎认为包含很好,当我放入 CDocument d 时更是如此;它亮起表示它识别 CDocument 类型。

C++ 编译器错误未 解决外部

评论

1赞 Christian Abella 4/24/2015
这不是编译错误,而是链接错误。您可能需要在 Visual Studio 项目中包含该 gumbo-parser 中的所有类,以便编译这些类并可在链接期间使用。
0赞 Edge 4/24/2015
你的意思是我需要在我的项目中包含更多的 .h 文件吗?我注意到我已经包含在它们自己的代码中的两个 .h 文件似乎包含所有其他必需的文件。
0赞 Christian Abella 4/24/2015
不是真正包含,而是在 Visual Studio 的项目工作区中添加这些文件(.h 和 .cpp)。这样它就会被编译。
0赞 Edge 4/24/2015
我可能会尝试这样做,尽管考虑到我目前的方法适用于 Boost 库,这似乎很奇怪。我注意到此库的所有文件都在解决方案资源管理器的“外部依赖项”文件夹下正确找到。
2赞 Christian Abella 4/24/2015
我也在 VS2010 中编译该库。您是否已经将秋葵浓汤 C 编译为您现在尝试编译的 C 只是一个经线

答:

2赞 Edge 4/24/2015 #1

和往常一样,很明显我做JS开发人员太久了。我真的需要编译一个 .lib 文件。感谢克里斯蒂安提醒我这一点。

Google 最初的 gumbo-parser 项目包括一个 VS 项目。我打开它并编译它,修复了所有项目设置问题,以便我可以将其导入到我的项目中,我通过我的 VS 项目的配置属性 -> 链接器 -> 输入 -> 其他依赖项设置。

接下来,我从包装库 gumbo-query 中添加了额外的源文件,其中我必须修复原始 gumbo-parser 项目中的 parser.h/parser.cpp 与包装库中的 Parser.h/Parser.cpp 文件之间的命名冲突。我还将所有引用更改为#include <gumbo.h>#include "gumbo.h"

最终,我得到了一个包含原始库和包装库的 gumbo.lib 文件,并将其导入到我的项目中,我现在似乎能够成功使用这些函数。