我试图在g++ (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04) 4.6.4)
中编译Octave C ++代码here。
以上修剪过的版本将在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++
,因为我最终希望能够从另一个地方调用Octave函数程序我用C ++编写。
答案 0 :(得分:1)
您需要链接到八度音阶库。如果库是octave.a
:
g++ -loctave temp.cpp
答案 1 :(得分:1)
如我的评论中所示,可以找到一个简单的例子in this 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
编译和链接测试应用程序。
答案 2 :(得分:0)
将库目录添加到链接命令:
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链接器错误:
Converting std::__cxx11::string to std::string
“如果您收到链接器错误,这些错误涉及对涉及std :: __ cxx11命名空间中的类型或标签[abi:cxx11]的符号的未定义引用,那么它可能表示您正在尝试将使用不同编译的目标文件链接在一起_GLIBCXX_USE_CXX11_ABI宏的值。这通常在链接到使用旧版GCC编译的第三方库时发生。“
在包含任何标准库标题之前定义以下宏应解决您的问题:
#define _GLIBCXX_USE_CXX11_ABI 0