首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R“未定义引用”,而不是为SWIG生成的R包装器生成..so/..dll

R“未定义引用”,而不是为SWIG生成的R包装器生成..so/..dll
EN

Stack Overflow用户
提问于 2015-03-04 05:38:28
回答 1查看 470关注 0票数 1

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

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

我成功地通过以下方法创建了R包装器和.R文件:

代码语言:javascript
复制
swig -r cgp.i

使用从CGP-Library github存储库检索的.i文件,在这里:https://github.com/AndrewJamesTurner/CGP-Library

我设法安装了RTools:

代码语言:javascript
复制
> 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

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

代码语言:javascript
复制
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\;

当我跑步时:

代码语言:javascript
复制
R CMD SHLIB cgp_wrap.c

该命令运行,但只提供给我cgp_wrap.o文件,而不给出cgp_wrap.so/cgp_wrap.dll。

我得到了一串我猜是例外的东西(看起来是这样的):

代码语言:javascript
复制
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接口),我花了将近一周的时间才走到这一步。但现在我迷路了。我不知道从这里往哪里走。

政策协商组-图书馆已经有几年了,我找不到任何可能表明它坏了的东西,这使我得出一个显而易见的结论,那就是这是一个PEBCAK问题。

如果有人能在心里找到同情我,伸出援助之手,那就太棒了(也让你很棒!)

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

干杯

编辑:我还尝试在假设它是一个c++库(而不是c)的前提下运行它,使用SWIGWIN中的follwing:

代码语言:javascript
复制
swig -c++ -r -o example_wrap.cpp example.i

这除了在cmd中提供稍微不同的消息(但本质上是相同的)之外,没有什么不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 01:50:46

那绝对是PEBCAK。也是个很下流的人。事实证明,在半途而废之前,我不仅还有很长的路要走,而且文档有时还远未完成。

对于那些希望从现有的C源代码和现有的dll编译R兼容的dll的人来说,尝试一下(对于那些在阅读这篇哈哈的时候眼睛滚动的人来说,很抱歉)

swig -r example.i

-this将生成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

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

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

非常感谢伊恩·贝尔帮我照看孩子。您可以在这里找到他的GitHub回购(https://github.com/ibell),其中有几个用于SWIG/minGW的工作示例,并通过SWIG/minGW (全部用于R)从Linux交叉编译到Windows。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28847348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档