我正在尝试使用R生成2个文件,第一个实际生成的文件相当不错,但第二个文件告诉我以下内容:
conteo_correlaciones.c:3:15:错误:R.h:没有这样的文件或目录 conteo_correlaciones.c:4:24:错误:Rinternals.h:没有这样的文件或 目录conteo_correlaciones.c:31:错误:预期'=',',',';', 'countcorrelations'之前的'asm'或'属性'
Rh和Rinternals.h都是从R目录复制的,它们与其他文件在同一个目录中,但是我无法通过这个错误,这些文件被这样的包调用:
#include <R.h>
#include <Rinternals.h>
我在终端上做的是:
R CMD SHLIB conteo_correlaciones.c
效果很好并为我生成正确的文件,并且:
gcc -dynamiclib conteo_correlaciones.c -o conteo_correlaciones.so
这引发了我上述错误。知道可能是什么?
答案 0 :(得分:8)
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
正如您所看到的,创建正确的二进制文件需要很长的标记列表。第一行是编译,第二行是链接。正如你所看到的那样,它甚至都不像你想要的那样“手工”。
至于确切的错误 - 它只是你会得到的许多错误中的一个 - 在上面的例子中,你需要包含R的包含-I
的路径。还有其他人,所以你不想去那里,只要坚持R CMD SHLIB
。
答案 1 :(得分:1)
你必须改变
#include <R.h>
#include <Rinternals.h>
到
#include "R.h"
#include "Rinternals.h"
如果头文件与代码文件在同一目录中。
或者您可以将正确的包含路径添加到gcc命令行(例如-I/usr/share/R/include
)。
答案 2 :(得分:0)
首先找到存储R.h的位置(如果已从源安装R,则可以在/ usr / include或/ usr / local / include或任何位置)。在我的情况下,它位于/ 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/
然后编译应运行正常。