查看: 1463|回复: 2

ubuntu下运行Viewer 示例代码出现undefined reference to `osgViewer::Viewer::Vie...

[复制链接]

该用户从未签到

发表于 2021-5-1 22:26:50 | 显示全部楼层 |阅读模式
按照标准流安装的OSG:
mkdir build
cd build
cmake -D BUILD_OSG_EXAMPLES=ON ..
make
make install

也修改了/etc/profile:
export PATH=${PATH}:/usr/local/share/OpenSceneGraph/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
export OSG_FILE_PATH=/home/liukai/Reply/OpenSceneGraph-Data-OpenSceneGraph-Data-3.4.0

然后在终端内可以成功执行osgviewer cow.osg。

但是我想在vs code里面调用osg来写写程序测试下:

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main( )
{
    osgViewer::Viewer viewer;
    viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
    return viewer.run();
}

结果一运行就报错,网上的解决方法几乎都试过了,但是都没用。
liukai@liukai-X555LB:~/Documents/Code_WorkSpace/Test$ cd "/home/liukai/Documents/Code_WorkSpace/Test/" && g++ my.cpp -o my && "/home/liukai/Documents/Code_WorkSpace/Test/"my
/usr/bin/ld: /tmp/ccLmafQz.o: in function `main':
my.cpp.text+0x2a): undefined reference to `osgViewer::Viewer::Viewer()'
/usr/bin/ld: my.cpp:(.text+0x7a): undefined reference to `osgViewer::Viewer::setSceneData(osg::Node*)'
/usr/bin/ld: my.cpp:(.text+0xa7): undefined reference to `osgViewer::Viewer::run()'
/usr/bin/ld: my.cpp:(.text+0xb9): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: my.cpp:(.text+0x112): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: /tmp/ccLmafQz.o: in function `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x16): undefined reference to `osgDB::Registry::instance(bool)'
/usr/bin/ld: my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x30): undefined reference to `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, osgDB::Options const*)'
collect2: error: ld returned 1 exit status


求求各位大佬给萌新指出一条明路吧

该用户从未签到

 楼主| 发表于 2021-5-2 15:20:33 | 显示全部楼层
大概知道了,应该是要添加外部动态链接库so,如果在终端里使用g++ my.cpp -I /usr/local/include/ -o my -L /usr/local/lib/ -lOpenThreads -losgDB -losgText -losgUtil -losg -losgViewer -losgGA -losgManipulator -losgVolume -losgSim的话可以成功编译,但是不知道为啥我在VS CODE里面把tasks.json改成下面这个样子还是undefined reference
  1. {
  2.     "tasks": [
  3.         {
  4.             "type": "cppbuild",
  5.             "label": "C/C++: g++ 生成活动文件",
  6.             "command": "/usr/bin/g++",
  7.             "args": [
  8.                 "-g",
  9.                 "${file}",
  10.                 "-I/usr/local/include/",
  11.                 "-o",
  12.                 "${fileDirname}/${fileBasenameNoExtension}",
  13.                 "-L/usr/local/lib/",
  14.                 "-lOpenThreads",
  15.                 "-losgDB",
  16.                 "-losgText",
  17.                 "-losgUtil",
  18.                 "-losg",
  19.                 "-losgViewer",
  20.                 "-losgGA",
  21.                 "-losgManipulator",
  22.                 "-losgVolume",
  23.                 "-losgSim",
  24.             ],
  25.             "options": {
  26.                 "cwd": "${workspaceFolder}"
  27.             },
  28.             "problemMatcher": [
  29.                 "$gcc"
  30.             ],
  31.             "group": {
  32.                 "kind": "build",
  33.                 "isDefault": true
  34.             },
  35.             "detail": "调试器生成的任务。"
  36.         }
  37.     ],
  38.     "version": "2.0.0"
  39. }
复制代码

X555LB:~/Documents/Code_WorkSpace/Test$ cd "/home/liukai/Documents/Code_WorkSpace/Test/" && g++ my.cpp -o my && "/home/liukai/Documents/Code_WorkSpace/Test/"my
/usr/bin/ld: /tmp/ccY0FVyZ.o: in function `main':
my.cpp.text+0x2a): undefined reference to `osgViewer::Viewer::Viewer()'
/usr/bin/ld: my.cpp:(.text+0x7a): undefined reference to `osgViewer::Viewer::setSceneData(osg::Node*)'
/usr/bin/ld: my.cpp:(.text+0xa7): undefined reference to `osgViewer::Viewer::run()'
/usr/bin/ld: my.cpp:(.text+0xb9): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: my.cpp:(.text+0x112): undefined reference to `osgViewer::Viewer::~Viewer()'
/usr/bin/ld: /tmp/ccY0FVyZ.o: in function `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x16): undefined reference to `osgDB::Registry::instance(bool)'
/usr/bin/ld: my.cpp:(.text._ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN5osgDB12readNodeFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x30): undefined reference to `osgDB::readNodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, osgDB::Options const*)'
collect2: error: ld returned 1 exit status


该用户从未签到

 楼主| 发表于 2021-5-3 11:02:29 | 显示全部楼层
可能是vs code那个code runner的问题,我之前一直都是点击右上角的code runner三角形来运行代码,结果不知道为啥,我修改了tasks.json对code runner好像不起作用,所以不管我怎么改,点击code runner都是按照下面这样子来编译的,所以当然没用。
其实这个问题直接使用-l链接库名 (即**把usr/local/lib下的库文件去掉lib 和.so后加上-l)**把程序中需要用到的链接库放在编译指令的后面就可以了,同样的只要在tasks.json里加上就行。
然后使用ctrl+F5来运行程序的话,就没问题了,靠,折腾了我几天,我傻啦。但是为什么code runner没对tasks.json的修改没生效,这又是另一个问题了。后来我直接把code runner卸载了,以后还是老老实实的用ctrl+F5,随便好好学一下json好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表