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库生成.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)
- 如何包装第三方DLL在R中使用
- 用于LabView中使用的本机c++的c++/cli dll包装器
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 无法使用c++/cli包装从c#dll加载函数
- 如何使用指针作为参数在 C# 中包装C++ DLL?
- C++ DLL 包装器 vb.net 传递字节数组的字节数组?
- 设置包装器以使用C 中的C#.dll
- C++/CLI 包装器不能使用来自本机C++ dll 的矢量
- 用多个C#.dll包装多个C++.dll
- 使用C /CLI包装器DLL时缺少功能
- 包装DLL-了解导入失败的原因
- 编译 TCL-DLL 包装器时出现的问题
- 在 C++ 中使用 C# COM 包装的 DLL 会抛出未注册的类
- 如何从c#中的托管c++dll(使用包装类)获取字符串
- 通过托管C++包装程序从非托管C++dll运行C#函数
- 动态加载.NET DLL包装C++DLL
- R CMD SHLIB 'undefined reference'并且不为 SWIG 生成的 R 包装器生成 .so/.dll
- 将 CLR DLL 包装在本机 DLL 中
- 在Visual Studio上为.net构建64位的QUICKFIX.. NET c++ DLL包装器)
- DLL包装器和DLL的区别