R在尝试编译时抛出错误
我尝试使用R生成2个文件第一个文件实际上生成的非常好,但第二个文件告诉我: conteo_correlaciones.c:3:15:错误:R.h:没有这样的文件或目录 conteo_correlaciones.c:4:24:错误:Rinternals.h:没有这样的文件或 目录conteo_correlaciones.c:31:错误:应为“=”、“、”、“;”, “countcorrelations”之前的“asm”或“属性” R.h和Rinternals.h都是从R目录中复制的,它们与其余文件位于同一目录中,但我无法克服此错误,这些文件由包含调用,如下所示:R在尝试编译时抛出错误,r,compiler-errors,terminal,R,Compiler Errors,Terminal,我尝试使用R生成2个文件第一个文件实际上生成的非常好,但第二个文件告诉我: conteo_correlaciones.c:3:15:错误:R.h:没有这样的文件或目录 conteo_correlaciones.c:4:24:错误:Rinternals.h:没有这样的文件或 目录conteo_correlaciones.c:31:错误:应为“=”、“、”、“;”, “countcorrelations”之前的“asm”或“属性” R.h和Rinternals.h都是从R目录中复制的,它们与其余文件
#include <R.h>
#include <Rinternals.h>
这非常有效,并为我生成了正确的文件和:
gcc -dynamiclib conteo_correlaciones.c -o conteo_correlaciones.so
这让我想起了前面提到的错误。知道会是什么吗 你必须改变
#include <R.h>
#include <Rinternals.h>
如果头文件与代码文件位于同一目录中。
或者您可以将正确的include路径添加到gcc命令行(例如,-I/usr/share/R/include
)。您必须更改
#include <R.h>
#include <Rinternals.h>
如果头文件与代码文件位于同一目录中。
或者您可以将正确的include路径添加到gcc命令行(例如,
-I/usr/share/R/include
)。R CMD SHLIB
添加所有适当的标志以编译代码。你不能(可靠地)手工编译你的代码R CMD SHLIB
已经创建了所有必要的文件,因此您不需要自己运行gcc
例如,这就是R CMD SHLIB
运行的内容:
$ R CMD SHLIB foo.c
gcc -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include
-I/Library/Frameworks/R.framework/Resources/include/x86_64
-I/usr/local/include -fPIC -g -O2 -c foo.c -o foo.o
gcc -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-undefined dynamic_lookup -single_module -multiply_defined suppress
-L/usr/local/lib -o foo.so foo.o -F/Library/Frameworks/R.framework/..
-framework R -Wl,-framework -Wl,CoreFoundation
如您所见,创建正确的二进制文件需要一长串标志。第一行是编译,第二行是链接。正如你所看到的,它甚至与你试图“用手”做的事情并不接近
至于确切的错误-这只是您将得到的众多错误之一-在上述情况下,您需要使用
-I
包含R的include路径。还有其他的,所以你不想去那里,只要坚持使用R CMD SHLIB
R CMD SHLIB
添加所有合适的标志来编译你的代码。你不能(可靠地)手工编译你的代码R CMD SHLIB
已经创建了所有必要的文件,因此您不需要自己运行gcc
例如,这就是R CMD SHLIB
运行的内容:
$ R CMD SHLIB foo.c
gcc -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include
-I/Library/Frameworks/R.framework/Resources/include/x86_64
-I/usr/local/include -fPIC -g -O2 -c foo.c -o foo.o
gcc -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-undefined dynamic_lookup -single_module -multiply_defined suppress
-L/usr/local/lib -o foo.so foo.o -F/Library/Frameworks/R.framework/..
-framework R -Wl,-framework -Wl,CoreFoundation
如您所见,创建正确的二进制文件需要一长串标志。第一行是编译,第二行是链接。正如你所看到的,它甚至与你试图“用手”做的事情并不接近
至于确切的错误-这只是您将得到的众多错误之一-在上述情况下,您需要使用
-I
包含R的include路径。还有其他的,所以你不想去那里,只要坚持使用R CMD SHLIB
首先定位R.h的存储位置(它可以在/usr/include或/usr/local/include中,如果R是从源代码安装的,也可以在任何地方)。在我的例子中,它位于/home/user/R/include/:
然后导出路径:
export CPATH=/home/user/R/include/
export C_INCLUDE_PATH=/home/user/R/include/
export CPLUS_INCLUDE_PATH=/home/user/R/include/
export GCC_INCLUDE_DIR=/home/user/R/include/
然后编译应该可以正常运行。首先找到R.h的存储位置(它可以位于/usr/include或/usr/local/include中,如果R是从源代码安装的,则可以位于任何位置)。在我的例子中,它位于/home/user/R/include/: 然后导出路径:
export CPATH=/home/user/R/include/
export C_INCLUDE_PATH=/home/user/R/include/
export CPLUS_INCLUDE_PATH=/home/user/R/include/
export GCC_INCLUDE_DIR=/home/user/R/include/
然后编译应该可以正常运行