R выкидывает ошибки при попытке компиляции - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь использовать R для генерации 2 файлов, первый действительно генерирует довольно хорошо, но второй говорит мне следующее:

conteo_correlaciones.c: 3: 15: error: Rh:Нет такого файла или каталога conteo_correlaciones.c: 4: 24: ошибка: Rinternals.h: Нет такого файла или каталога conteo_correlaciones.c: 31: ошибка: ожидается '=', ',', ';', 'asm' или ' атрибут 'перед' countcorrelations '

и 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

, который выдает мне вышеупомянутую ошибку.Есть идеи, что может быть?

Ответы [ 3 ]

8 голосов
/ 06 февраля 2012

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 голос
/ 06 февраля 2012

Вам нужно изменить

#include <R.h>
#include <Rinternals.h>

на

#include "R.h"
#include "Rinternals.h"

, если заголовочные файлы находятся в том же каталоге, что и ваши файлы кода.Или вы можете добавить правильный include-путь к командной строке gcc (например, -I/usr/share/R/include).

0 голосов
/ 06 ноября 2015

Сначала найдите, где хранится Rh (это может быть в / 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/

Компиляция должна выполняться нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...