R CMD SHLIB'未定义参考'并且不为SWIG生成的R包装器生成.so / .dll

时间:2015-03-04 05:38:29

标签: c++ c r dll cmd

我试图从这里找到的CGP-Library生成一个.so / .dll: http://www.cgplibrary.co.uk/files2/Download-txt.html

我没兴趣从这个库生成一个包,只是为了生成一个可以在R中使用的.so / .dll来提供一些额外的功能。

我设法通过以下方式使用SWIG-3.0.5创建R包装器和.R文件:

swig -r cgp.i

在此处从CGP-Library github存储库中检索.i文件: https://github.com/AndrewJamesTurner/CGP-Library

我设法安装了RTools:

> find_rtools(T)
Scanning path...
ls : C:\Rtools\bin\ls.exe 
gcc: C:\Rtools\GCC-46~1.3\bin\gcc.exe 
VERSION.txt
Rtools version 3.1.0.1942 
Version: 3.1 
[1] TRUE

并设置PATH以包含适当的目录:

C:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;C:\R\R-3.0.2\bin\i386;%SystemRoot%\system32;
%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files\QuickTime\QTSystem\;%SDS_ALGO_PATH%;C:\Program Files\MySQL\MySQL Utilities 1.4.3\;
C:\Program Files\MySQL\MySQL Utilities 1.4.3\Doctrine extensions for PHP\; 
C:\Program Files\CodeBlocks\MinGW\bin; C:\swigwin-3.0.5\;

当我跑步时:

R CMD SHLIB cgp_wrap.c

命令运行但只给我cgp_wrap.o文件,没有cgp_wrap.so/cgp_wrap.dll。

我得到一串我猜的异常(看起来像这样):

cgp_wrap.o:cgp_wrap.c:(.text+0x561b): undefined reference to `_imp__repeatCGP'
cgp_wrap.o:cgp_wrap.c:(.text+0x58a9): undefined reference to `_imp__runCGP'
cgp_wrap.o:cgp_wrap.c:(.text+0x5b19): undefined reference to `_imp__copyChromoso
me'

计数太多,看起来好像cgp_wrap.c中的每个函数都可能返回一个未定义的引用。

我对此非常陌生(创建库并尝试与R接口),我花了将近一周的时间来实现这一目标。但现在我迷路了。我不知道从哪里开始。

CGP-Library已经存在了几年了,我找不到任何暗示它被破坏的东西,这使我得出一个明显的结论,即这是一个PEBCAK问题。

如果有人能够在他们心中找到对我的同情并伸出援助之手,那将是非常棒的(并让你真棒!)

哦,是的,我正在运行32位Windows 7和R-3.0.2(Rstudio为0.98.1091)。

干杯

编辑:我也试过运行它,假设它是一个c ++库(而不是c)使用SWIGWIN中的后续内容:

swig -c++ -r -o example_wrap.cpp example.i

除了在cmd中提供略有不同(但基本相同)的消息之外,这没什么区别。

1 个答案:

答案 0 :(得分:0)

嗯,这绝对是PEBCAK。一个非常非常的人。事实证明,在对这些东西不熟悉之前,我还有很长的路要走,但文档有时远未完成。

对于那些希望从现有的C源代码编译R兼容dll的人和现有的dll尝试一下(对于那些在他们读这个的时候滚动眼睛的人感到遗憾哈哈)

swig -r example.i

- 这会生成你的wrap_example.c和example.R文件

gcc -shared example_wrap.c example.c -I"full\path\to\R\include" -L"full\path\to\R.dll" -lR -lexample -o example.dll

- 这将从SWIG R包装的C库中生成一个新的dll。

需要注意的事项是确保您的包含文件和原始C源代码文件具有相同的名称并位于SWIG目录中。您可以指定现有dll的完整路径,也可以将其放在SWIG目录中。

非常感谢Ian Bell为此照顾我。 你可以在这里找到他的GitHub仓库(https://github.com/ibell),它有几个SWIG / minGW的工作示例,并通过SWIG / minGW从Linux到Windows交叉编译(全部用于R)