【问题标题】:Visual Studio 2008 c++ linker refuses to link?Visual Studio 2008 c++ 链接器拒绝链接?
【发布时间】:2011-08-03 13:06:06
【问题描述】:

我在这里用头撞墙。

我只想在 cpp windows 窗体应用程序中链接一个静态 .lib 文件!因此,我的项目文件夹中有一个包含该 .lib 的头文件的文件夹(如果有人想知道,lib 是 Yaml-cpp)。我有一个 lib 文件夹,其中包含该库的 .lib 文件。

我在一个空白项目上测试过

1.我在 VS2008 中用 C++ 制作了一个新的 windows 窗体项目。

2.我转到项目属性 - c/c++ 常规和其他包含 yaml-cpp 头文件的目录

3.我去链接器并添加我的lib目录的路径

4.我去链接器 - 输入并添加我的 .lib 文件

5.我检查链接器命令行,它包含我的 .lib 文件,所以它必须全部设置。

6.然后我在一个onbutton函数体中编写示例代码(出现在form1.h fie中)。

示例代码来自这里http://code.google.com/p/yaml-cpp/wiki/HowToParseADocument,它很简单:

#include <fstream>
#include "yaml.h"

然后:

std::ifstream fin("test.yaml");
YAML::Parser parser(fin);

YAML::Node doc;
while(parser.GetNextDocument(doc)) {
    //do nothing yet
}

7.然后我编译并有 10 个“未解决的外部”。

我查看了另一个使用相同库的项目,它具有完全相同的目录结构,在链接器中添加的 .lib 相同名称 - 输入 - 附加依赖项,相同的 .lib 和 .h 文件。它适用于那个项目——但它不适合我。

这到底是怎么回事?

编辑:我尝试制作新的 Windows 32 控制台应用程序,它工作正常。然后我尝试制作另一个新的 Windows 窗体应用程序,但失败了。

现在已经确定了。在控制台应用程序中链接库的相同步骤在 Windows 窗体应用程序中失败。为什么?

【问题讨论】:

  • 请您包含具体的链接器错误消息吗? (我最初的猜测是 .lib 引用了其他 .lib 并且您没有将它们全部包含在链接器设置中)
  • 是的,尽管它们很大......为了澄清,我检查了另一个使用相同库的 c++ 项目,除了我也链接的一个库(yaml-cppd.lib)之外,它没有链接任何东西。还有另一个 yaml-cpp.lib 文件,但它没有被该项目链接,并且该项目工作得很好......并且链接第二个库无论如何都没有帮助
  • 1>test_yaml_cpp.obj : 错误 LNK2028: 未解析的令牌 (0A000036) "public: bool __clrcall YAML::Parser::GetNextDocument(class YAML::Node &)" (?GetNextDocument@Parser@YAML @@$$FQAM_NAAVNode@2@@Z) 在函数“private: void __clrcall test_yaml_cpp::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)”(?button1_Click@Form1@test_yaml_cpp@ @$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
  • 1>test_yaml_cpp.obj : 错误 LNK2028: 未解析的令牌 (0A000037) "public: __clrcall YAML::Node::~Node(void)" (??1Node@YAML@@$$FQAM@ XZ) 在函数“private: void __clrcall test_yaml_cpp::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)”中引用 (?button1_Click@Form1@test_yaml_cpp@​​@$$FA$AAMXP$AAVObject@ System@@P$AAVEventArgs@4@@Z)
  • 1>test_yaml_cpp.obj : 错误 LNK2028: 未解析的令牌 (0A000038) "public: __clrcall YAML::Node::Node(void)" (??0Node@YAML@@$$FQAM@XZ ) 在函数“private: void __clrcall test_yaml_cpp::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)”中引用 (?button1_Click@Form1@test_yaml_cpp@​​@$$FA$AAMXP$AAVObject@System @@P$AAVEventArgs@4@@Z)

标签: visual-c++ linker static-libraries static-linking


【解决方案1】:

从您的解释来看,您所做的似乎是正确的,让我们进行一些盲目的故障排除。

  1. 尝试为库路径和其他包含目录提供完整路径而不是相对路径。 (但正如你所说,文件正在被读取,这应该是问题所在。)
  2. 如果您使用的是原始 libyaml-cppmdd.lib 及其包含文件的副本,请检查包含的头文件是否与 lib 版本相同。
  3. 检查代码的任何部分是否有任何有声明但没有定义的函数。
  4. 检查您是否正在访问库中的任何私有函数。

请在Troubleshooting UnResolved External Symbol error 上阅读这篇 Microsoft 文章。

希望对你有帮助!

【讨论】:

  • 好吧,问题是 win 32 控制台应用程序使用相同的库、相同的路径、相同的包含文件工作!但是 Windows 窗体应用程序不起作用(相同的路径、相同的包含文件、相同的示例代码执行)。所以我们可以将 1,2,3,4 视为无关紧要的 :( 因为它们都在 win 32 控制台应用程序中“通过”。所以 Windows 窗体应用程序一定有问题?
  • 检查您是否在使用任何 win32 库。尝试包括&lt;windows.h&gt;。右键单击项目、属性、链接器、输入。从 Additional Dependencies 设置中删除 $(NoInherit)。如果您使用 VS2010,请将“user32.lib”放入该设置中。
  • 也尝试将 /clr 模式设置为正常(普通 /clr 模式)
  • 如果这些都不起作用,请尝试使用extern "C" 将库函数声明嵌套在包含文件中。 (可能是我箭袋中的最后一个箭头:D)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多