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)
我正在尝试从此处找到的 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)