【问题标题】:R CMD SHLIB 'undefined reference' and not generating .so/.dll for SWIG generated R wrapperR CMD SHLIB '未定义的引用' 并且不为 SWIG 生成的 R 包装器生成 .so/.dll
【发布时间】:2015-03-04 05:38:28
【问题描述】:

我正在尝试从此处找到的 CGP 库生成 .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 中给出稍微不同(但基本相同)的消息之外,这并没有什么区别。

【问题讨论】:

  • 即使我在原始 C 库上运行 R CMD SHLIB,我仍然只能得到 .o 文件而没有生成 .dll/.so。我已经尝试了其他几种方法,包括这里(stats.uwo.ca/faculty/murdoch/software/compilingDLLs/…),并且无法为我的生命生成一个正常运行的 dll。没有人有任何建议来启动和运行它

标签: c++ c r dll cmd


【解决方案1】:

嗯,肯定是 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 帮助我度过了这个难关。 您可以在此处找到他的 GitHub 存储库 (https://github.com/ibell),其中有几个适用于 SWIG/minGW 的工作示例,并通过 SWIG/minGW 从 Linux 交叉编译到 Windows(全部用于 R)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-10-13
    • 2019-08-23
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多