我正在制作一个c ++共享库以包含在Linux上的IDL程序中。我正在使用call_external,一切正常。但是,我习惯于动态链接fftw到我希望包含在库中的代码中。代码可以很好地编译到库文件中,但是当我尝试运行它时,idl程序会崩溃,并显示错误“符号查找错误..未定义的符号:fftw_plan ...”
我怀疑这是由于动态链接在共享库中不起作用,但不确定如何处理。我看过fftw文档和IDL帮助。我已经尝试过搜索该主题,但这有点小问题。
所以在我的makefile文件中,我使用'FFTWFLAG = -lfftw3 -lm'链接共享库 并使用
制作库文件OneTurn.so: $(OBJECTS)
$(CC) $(INCFLAGS) $(LDFLAGS) $(FFTWFLAG) -o OneTurn.so $(OBJECTS)"
然后我要使用idp从idl调用c ++库
IDL> a=double(1)
IDL> t=call_external('OneTurn.so', 'OneTurn', a, a, /D_VALUE, /UNLOAD,/CDECL)
Making bunch
/usr/local/harris/idl87/bin/bin.linux.x86_64/idl: symbol lookup error: ./OneTurn.so: undefined symbol: fftw_plan_r2r_2d
如果我不包括fftw内容,一切都会按预期进行。
更新
我必须使用-Wl,-lfftw3,lm
将fftw链接器参数传递给共享库。
现在可以编译并运行,但是fftw代码仍然不起作用!正在努力...
到目前为止,感谢您的回答和建议!
更新2
我当时是个木偶:没有为一个函数添加一些代码,那是未定义的符号...我不认识它,因为它具有前后修复。感谢您的帮助!
答案 0 :(得分:0)
我最近还没有使用C ++做到这一点。可能存在名称修改问题?用.so
查看nm
文件,以确保您具有正确的符号并检查其名称。