HIReaper 发表于 2021-5-1 22:26:50

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


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

HIReaper 发表于 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
{
    "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

HIReaper 发表于 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好了。
页: [1]
查看完整版本: ubuntu下运行Viewer 示例代码出现undefined reference to `osgViewer::Viewer::Vie...