编译 C++ 源代码以将 .off 文件转换为 Android OpenGL ES 可读的 XML 的问题

Posted

技术标签:

【中文标题】编译 C++ 源代码以将 .off 文件转换为 Android OpenGL ES 可读的 XML 的问题【英文标题】:Problems with compiling C++ Source for Converting .off Files to XML Readable by Android OpenGL ES 【发布时间】:2012-10-30 06:03:38 【问题描述】:

我在 *** 上找到了一种将 3D 模型导入 android OpenGL 的方法:

Is there a way to import a 3D model into Android?

尝试按照说明复制源代码并尝试编译程序。我得到了大量的错误,这里只是一个小样本:

    /tmp/ccPavSpL.o:OFF-OpenGL_loader.cc:(.text+0xd): undefined reference to `std::basic_string<char,
    std::char_traits<char>, std::allocator<char> >::size() const'

我认为问题在于我没有向程序传递参数,所以我尝试像这样传递参数:

    $  gcc OFF-OpenGL_loader.cc circle.off output.xml

(我的 .off 文件与其他源文件位于同一目录中,并且 output.xml 也在同一文件中。) 我收到了这些错误

    /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld:circle.off: file format not recognized;
    treating as linker script
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld:circle.off:2: syntax error
    collect2: ld returned 1 exit status

无论如何,我觉得我不应该有一个 output.xml 文件,但是当我没有一个时,它给了我一个找不到文件的错误。

开源文件不在实际文件中,所以我觉得我应该向你展示我所有的文件,我觉得将其他人的源代码上传到 github 存储库很奇怪,所以这里是源文件的快速共享链接:

http://d01.megashares.com/dl/2YylIbE/SourceCodeAnd.offFile.zip

我觉得像这样共享文件很奇怪^^,但我真的没有看到任何其他选择。它只包含我的 .off 文件和 .xml 文件以及 C 和 C++ 文件。

任何帮助将不胜感激,过去几天我一直坚持这一点。 谢谢!

编辑

所以我用 g++ 不带参数地运行它,结果如下:

     $  g++ OFF-OpenGL_loader.cc
     /tmp/ccNFneYn.o:OFF-OpenGL_loader.cc:(.text+0x1aa): undefined reference to  
     `ReadFile::getExtension(char*)'/tmp/ccNFneYn.o:
    OFF-OpenGL_loader.cc:(.text+0x2f8): undefined reference to 
    operator>>(std::basic_ifstream<char, std::
    char_traits<char> >&, ReadFile&)'/tmp/ccNFneYn.o:OFF-
    OpenGL_loader.cc:(.text+0x6de): undefined reference to `ReadFile::ReadFile()'/tmp/ccNFneYn.o:OFF-
    OpenGL_loader.cc:(.text+0x6f9): undefined reference to `ReadFile::~ReadFile()'/usr/lib/gcc/i686-pc-
    cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: 
    /tmp/ccNFneYn.o: bad reloc address 0x1c in section 
    `.gcc_except_table'/usr/lib/gcc/i686-pc-cygwin/3.4.4/.
    ./../../../i686-pc-cygwin/bin/ld: final link failed: 
    Invalid operationcollect2: ld returned 1 exit status

我在寻找什么样的错误?

【问题讨论】:

第一个猜测是 gcc 链接到 C 库,而不是 C++ 库。尝试改用 g++。也不要将程序的参数传递给编译器,等到你有可执行文件运行。 啊,太好了,至少消除了我对参数的困惑。现在我用 g++ 运行它,我会发布结果。这是否意味着我只需要调试?我希望我知道 C++ 我想通了!!非常感谢!最重要的部分是意识到参数没有在编译时给出。我会回答下面的问题。 【参考方案1】:

问题是当我在 Visual Studio 中运行我的程序时,它会编译和运行程序,并且由于源需要参数才能运行,它会出现运行时错误。

然后因为我不知道如何将参数传递给 Visual Studio 中的程序,我尝试使用 Cygwin,它给了我错误,可能是因为它没有正确配置。不太清楚为什么会发生这些错误。

所以为了解决这整个问题,我只是使用 Visual Studio 构建了我的程序,导航到它在编译时创建的 .exe 文件,然后在命令行中运行该 .exe。

所以这个故事的寓意是:永远记住,当你点击那个绿色的播放按钮时,它会编译并运行程序。因此,如果您的错误与您运行程序的环境有关,即使您的代码非常好,您也可能会出错。

感谢 Bo Persson 帮助我了解这个想法!

【讨论】:

以上是关于编译 C++ 源代码以将 .off 文件转换为 Android OpenGL ES 可读的 XML 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?

与头文件一起使用时,使用个人 C++ 库编译代码会中断

如何将 void* 转换为 foo* 以符合 C++?

如何将 32 位 *.lib 文件转换为 64 位 *.a 文件

Android平台调用c++

C 和 C++ 编译器的问题