ubuntu下运行Viewer 示例代码出现undefined reference to `osgViewer::Viewer::Vie...
按照标准流安装的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+0x16): undefined reference to `osgDB::Registry::instance(bool)'
/usr/bin/ld: my.cpp:(.text._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
求求各位大佬给萌新指出一条明路吧 大概知道了,应该是要添加外部动态链接库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
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-I/usr/local/include/",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-L/usr/local/lib/",
"-lOpenThreads",
"-losgDB",
"-losgText",
"-losgUtil",
"-losg",
"-losgViewer",
"-losgGA",
"-losgManipulator",
"-losgVolume",
"-losgSim",
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
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+0x16): undefined reference to `osgDB::Registry::instance(bool)'
/usr/bin/ld: my.cpp:(.text._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
可能是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好了。
页:
[1]