OpenSceneGraph 编译 error LNK2019:unresolved external symbol 错误

在编译 OpenSceneGraph 的一个简单示例时,

 1 #include <osgViewer/Viewer>
 2 #include <osgDB/ReadFile> 3 
 4 
 5 void _tmain(int argc, _TCHAR* argv[])
 6 {
 7     osgViewer::Viewer viewer;
 8     viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
 9     viewer.realize();
10     viewer.run();    
11 }

遇到了 error LNK2019:unresolved external symbol 错误,错误提示如下;

1>Hello OSG's World.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall osgViewer::Viewer::`vbase destructor'(void)" (__imp_??_DViewer@osgViewer@@QAEXXZ) referenced in function _main
1>Hello OSG's World.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall osgViewer::Viewer::Viewer(void)" (__imp_??0Viewer@osgViewer@@QAE@XZ) referenced in function _main

LNK2019错误一般是 compile 能找到 header(.h)文件,但是在链接时找不到需要的 lib 库文件或者是 dll 文件。

一般认为在编译 OSG 简单示例的时候遇到这样的错误是因为错误的设置了 lib2。OSG 的 lib 目录中一般有两组文件名相似的 lib 文件,其中一组以 d 结尾,例如:osgDBd.lib, osgViewerd.lib,这个表示该 lib 是用于调试 debug,而不带 d 的一组是用于 release 版本。

如果没有正确的指定 lib 文件,那么一般会出现 error LNK2019 错误。比如,编译时指定的是 debug, 但是依赖项设置的却是不带 d 的那一组 release 版本的 lib 文件;或者是编译时指定 debug,但是依赖项设置的是带 d 的一组。只要编译的选项和调用的 lib 一致即可解决这个问题。

不过我仔细检查了自己调用的 lib,编译的选项和调用的 lib 都是 debug 版本的。

后来发现,开发机器是64位的,而编译选项的目标平台(platform)选择的却是 win32,修改为 x64 之后解决了这个链接错误。

也看到有人说1,前面函数声明与后面的函数定义参数类型不同时,有时 compile 能够通过,但是 link 的时候会出现 error LNK2019 错误。

参考链接:

  1. error LNK2019: unresolved external symbol
  2. 求助:最简单的OSG例子编译出错
  3. error LNK2019: unresolved external symbol "__declspec(dllimport)

posted on 2013-07-02 14:52  zhaorui  阅读(1078)  评论(0编辑  收藏  举报

导航