0

我正在尝试在这里获取 Octave C++ 代码以在g++ (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04) 4.6.4).

上面的这个修剪版本将编译为g++

#include <iostream>
#include <octave/oct.h>
using namespace std;

int main() {
//  Matrix L=Matrix(2,2);

  return 0;
}

但是如果我取消注释该行Matrix L=Matrix(2,2);然后用它编译g++ temp.cpp会给出错误消息:

/tmp/ccTa3Am5.o: In function `Array2<double>::~Array2()':
temp.cpp:(.text._ZN6Array2IdED2Ev[_ZN6Array2IdED5Ev]+0x1f): undefined reference to `Array<double>::~Array()'
/tmp/ccTa3Am5.o: In function `Array<double>::Array(dim_vector const&)':
temp.cpp:(.text._ZN5ArrayIdEC2ERK10dim_vector[_ZN5ArrayIdEC5ERK10dim_vector]+0x26): undefined reference to `Array<double>::get_size(dim_vector const&)'
/tmp/ccTa3Am5.o:(.rodata._ZTV5ArrayIdE[vtable for Array<double>]+0x10): undefined reference to `Array<double>::~Array()'
/tmp/ccTa3Am5.o:(.rodata._ZTV5ArrayIdE[vtable for Array<double>]+0x18): undefined reference to `Array<double>::~Array()'
collect2: ld returned 1 exit status

我不确定为什么。也许我错过了一个#include,也许我没有安装适当的文件,也许我没有链接到适当的库,或者我以某种方式滥用 Octave。

问题:为什么编译失败?我该如何解决?

mkoctfile --link-stand-alone temp.cpp如果我按照上面网站的说明使用它,它编译得很好,但是,g++如果可能的话,我想使用它,因为我最终希望能够从我用 C++ 编写的另一个程序中调用 Octave 函数。

4

3 回答 3

1

正如我的评论中所指出的,可以在这个 Howto中找到一个简单的例子。因此,在您的情况下,实现编译的一种简单方法是创建一个 makefile,如下所示:

makefile:
all: temp

clean:
    -rm temp.o temp

temp: temp.o
      mkoctfile --link-stand-alone -o temp temp.o

temp.o: temp.cpp
        g++ -c -I$(OCTAVE_INCLUDE)
        -I$(OCTAVE_INCLUDE)octave -o temp.o temp.cpp

$(OCTAVE_INCLUDE)是一个环境变量,应该设置为您的八度包含路径(例如/usr/include/octave-x.x.xx)。然后您可以使用命令简单地编译和链接您的测试应用程序make all

于 2013-09-03T13:16:32.813 回答
1

您需要链接到 octave 库。如果图书馆是octave.a

g++ -loctave temp.cpp
于 2013-09-03T13:01:28.953 回答
0

将库目录添加到您的链接命令:

  • 你的本地路径\octave-xxxx\lib\
  • 你的本地路径\octave-xxxx\lib\octave\xxxx\

mkoctfile -L"\your-path\octave-x.x.xx\lib" -L"\your-path\octave-x.x.x\lib\octave\x.x.xx" --link-stand-alone temp.cpp

对于 cxx11 链接器错误:
将 std::__cxx11::string 转换为 std::string

“如果您收到有关未定义引用符号的链接器错误,这些符号涉及 std::__cxx11 命名空间或标签 [abi:cxx11] 中的类型,那么它可能表明您正在尝试将使用不同值编译的目标文件链接在一起_GLIBCXX_USE_CXX11_ABI 宏。这通常发生在链接到使用旧版本 GCC 编译的第三方库时。

在包含任何标准库头文件之前定义以下宏应该可以解决您的问题:

#define _GLIBCXX_USE_CXX11_ABI 0
于 2017-02-06T20:53:42.057 回答