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

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

本文关键字:dll 包装 so undefined SHLIB CMD reference SWIG      更新时间:2023-10-16

我正试图从此处的CGP库生成.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:Rtoolsbinls.exe 
gcc: C:RtoolsGCC-46~1.3bingcc.exe 
VERSION.txt
Rtools version 3.1.0.1942 
Version: 3.1 
[1] TRUE

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

C:Rtoolsbin;C:Rtoolsgcc-4.6.3bin;C:RR-3.0.2bini386;%SystemRoot%system32;
%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;C:Program FilesATI TechnologiesATI.ACECore-Static;
C:Program FilesQuickTimeQTSystem;%SDS_ALGO_PATH%;C:Program FilesMySQLMySQL Utilities 1.4.3;
C:Program FilesMySQLMySQL Utilities 1.4.3Doctrine extensions for PHP; 
C:Program FilesCodeBlocksMinGWbin; C:swigwin-3.0.5;

当我运行时:

R CMD SHLIB cgp_wrap.c

该命令运行,但只给我cgp_wrap.o文件,而没有cgp_wrp.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_wrappe.c中的每个函数都可能返回一个未定义的引用。

我对此还很陌生(创建库并尝试与R接口),我花了将近一周的时间才走到这一步。但现在我迷路了。我不知道从这里到哪里去。

CGP图书馆已经存在了几年,我找不到任何迹象表明它已经坏了,这让我得出了一个明显的结论,那就是这是一个PEBCAK问题。

如果有人能在心里同情我,伸出援手,那将是很棒的(也会让你很棒!)

哦,是的,我正在运行32位Windows7和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

-这将生成wrappeexample.c和example。R文件

gcc -shared example_wrap.c example.c -I"fullpathtoRinclude" -L"fullpathtoR.dll" -lR -lexample -o example.dll

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

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

非常感谢伊恩·贝尔照顾我度过难关。你可以在这里找到他的GitHub回购(https://github.com/ibell)它有几个SWIG/minGW的工作示例,以及通过SWIG/minGW从Linux到Windows的交叉编译(全部用于R)