R CMD SHLIB 'undefined reference' 并且不为 SWIG 生成的 R 包装器生成 .so/.dll

R CMD SHLIB 'undefined reference' and not generating .so/.dll for SWIG generated R wrapper

我正在尝试从此处找到的 CGP-Library 生成 .so/.dll: http://www.cgplibrary.co.uk/files2/Download-txt.html

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

我设法使用 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

命令 运行s 但只给我 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 中给出略有不同(但基本相同)的消息外,这没有任何区别。

嗯,这绝对是 PEBCAK。也是一个非常笨拙的人。事实证明,我不仅在半途而废之前还有很长的路要走,而且文档有时还远未完成。

对于那些希望从现有 C 源代码和现有 dll 编译 R 兼容 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 对我的照顾。 您可以在此处 (https://github.com/ibell) 找到他的 GitHub 存储库,其中有几个 SWIG/minGW 的工作示例,并通过 [=29 从 Linux 交叉编译到 Windows =](全部用于R)