2014-12-04 3 views
2

Это, как представляется, обычная проблема, но я не могу обернуть эту проблему.Включить gsl_type.h. Файл не найден

У меня есть код .c, который я компилирую с помощью make-файла. Цель состоит в том, чтобы создать общий объект (.so), так что я могу запустить код C от R.

Вот мой Makefile:

obs = R_wrapper.o G.o develop.o utilities.o 
CFLAGS = -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG -I/usr/local/include -fPIC -g -O3 -c 
LFLAGS = -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -O3 -lgsl -lm -lgslcblas 

R_wrapper : $(obs) 
    $gcc $(LFLAGS) $(obs) -o R_wrapper.so 

R_wrapper.o : R_wrapper.c constants.h develop.h G.h 
    $gcc $(CFLAGS) R_wrapper.c 

G.o : G.c G.h constants.h utilities.h develop.h 
    $gcc $(CFLAGS) G.c develop.c 

develop.o : develop.c develop.h G.h constants.h 
    $gcc $(CFLAGS) develop.c 

utilities.o : utilities.c develop.h 
    $gcc $(CFLAGS) utilities.c 

Это отлично на компьютере работает в моей лаборатории, но это не работает на моем персональном компьютере. В чем причина этой проблемы - эти две строки в начале моего R_wrapper.c.

#include </opt/local/include/gsl/gsl_randist.h> 
#include </opt/local/include/gsl/gsl_rng.h> 

Я попытался переместить эти файлы вокруг и дают разные пути, поместить файлы в gal_type.h файлы в том же каталоге, что и мой файл R_wrapper, я попытался переименовать свои каталоги таким образом, что путь более обычное, но ОС не дало мне права переименовать opt в usr (что, вероятно, имеет смысл). Я не создал make-файл и не полностью его получил. Я бы предположил, что мне нужно будет изменить путь после аргумента -I где-нибудь в CFLAGS ИЛИ LFLAGS.

EDIT 1

Я изменил R_wrapper.c на моем лабораторном компьютере, чтобы избавиться от всего пути в #include <...>. Компиляция завершилась неудачно, как прогнозировалось @Beta. Затем я изменил свой файл makefile, чтобы добавить -I/opt/local/include/gsl в CFLAGS. Я не знаю, что вы подразумеваете под Verify that the makefile still works. Я попытался скомпилировать с моим измененным makefile на моем лабораторном компьютере, и это не удалось. Затем я повторно отредактировал мой файл makefile, изменив -I/opt/local/include/gsl на -I/usr/local/include/gsl, потому что на моем лабораторном компьютере папка gsl находится на /usr/local/include/gsl. -I/opt/local/include/gsl - это местоположение папки gsl на моем компьютере. Поэтому я застрял здесь в вашей процедуре.

Edit 2

я переместил папку gsl вокруг моего компьютера пытается включать в себя от различных путей. И некоторые интересные вещи случаются. Например, когда я положил папку gsl в Users/remi/Documents/Biologie/programing/C/ и записи (в CFLAGS)

-I/Users/remi/Documents/Biologie/programing/C/ 

Я получаю эту ошибку:

R_wrapper.c:43:10: fatal error: 'gsl_randist.h' file not found 
#include <gsl_randist.h> // goal. 

Когда я пишу (в CFLAGS)

Users/remi/Documents/Biologie/programing/C/gsl 

I получите это сообщение об ошибке:

"In file included from R_wrapper.c:43: /Users/remi/Documents/Biologie/programing/C/gsl/gsl_randist.h:22:10: fatal error: 
     'gsl/gsl_rng.h' file not found 
#include <gsl/gsl_rng.h>" 
+0

Судя по сообщению о 'GSL/gsl_rng.h 'не найден в Edit 2, вы должны писать' #include '(с префиксом пути' gsl/'до имени заголовка) в исходном коде. Это обычное соглашение. Затем вы указываете в параметре '-I' имя каталога, содержащего подкаталог' gsl', который содержит заголовки 'gsl _ *. H'. Вы должны прочитать документацию, и если она говорит '#include ' или '#include" gsl/gsl_randist.h ", то это то, что вы должны написать в своем коде, потому что (как вы обнаружил трудный путь), если вы этого не сделаете, это не сработает. –

+0

@JonathanLeffler Oh! Это решило мою проблему! Уф. Я много боролся с этой проблемой ... это было просто (как обычно). Большое спасибо! Можете ли вы дать ответ из своего комментария, чтобы я мог его проверить? –

+0

Включите эту библиотеку, используя: #include Eftekhari

ответ

4

Передача комментарий ответить

Судя по сообщению о gsl/gsl_rng.h не найдено, что упоминается в Edit 2, вы должны писать

#include <gsl/gsl_randist.h> 

(с пути префиксом gsl/ перед заголовком) в исходном коде. Это обычное соглашение. Затем вы указываете в параметре -I имя каталога, содержащего подкаталог gsl, который содержит заголовки gsl_*.h. В вашем Edit 2, вы говорите, поместить каталог gsl в /Users/remi/Documents/Biologie/programing/C/, так что вы тогда правильно использовать:

-I/Users/remi/Documents/Biologie/programing/C/ 

в командной строке, как вы пытались.

Вы должны прочитать документацию, и если он говорит, что написать одно из них:

#include <gsl/gsl_randist.h> 
#include "gsl/gsl_randist.h" 

то, что это то, что вы должны написать в коде, потому что (как вы обнаружили трудный путь), если вы нет, это не сработает.

Beta «s answer также утверждает

In general it's a bad idea to write paths into the #include statements unless you really have to; it causes just this kind of problem.

Я согласен, но ее выскажет сильнее:

  • Не пишите полные пути в #include заявления когда-либо.

Если вы их пишете, это радикально ограничивает переносимость вашего кода. Вы не можете полагаться на машины других людей, имеющие программное обеспечение, установленное в том же месте, где оно установлено в вашей системе.Если вы попробуете его в ПО с открытым исходным кодом, вы будете смеяться вне суда.

Будьте осторожны с людьми, которые получают симпатичный с ../somedir/header.h тоже - см. What are the benefits of a relative path such as "../include/header.h" for a header?.


Я наблюдаю, что GNU Scientific Library руководство имеет example program, который начинается:

#include <stdio.h> 
#include <gsl/gsl_sf_bessel.h> 

и раздел Compiling and Linking говорит:

The library header files are installed in their own gsl directory. You should write any preprocessor include statements with a gsl/ directory prefix thus,

#include <gsl/gsl_math.h> 

If the directory is not installed on the standard search path of your compiler you will also need to provide its location to the preprocessor as a command line flag. The default location of the gsl directory is /usr/local/include/gsl .

3

В общем, это плохая идея писать пути в операторы #include, если вам это не нужно; это вызывает именно такую ​​проблему.

На вашем лабораторном компьютере, редактировать R_wrapper.c:

#include <gsl_randist.h> 
#include <gsl_rng.h> 

Строить теперь должен потерпеть неудачу. Если это так, это подтверждает, что у вас нет других версий этих заголовков, плавающих вокруг, или ссылок на них, или что-то еще. Подтвердите, что он не работает, затем отмените изменение и подтвердите, что он работает снова.

Затем добавьте -I/opt/local/include/gsl в CFLAGS. Проверьте, что make-файл все еще работает.

Затем отредактировать R_wrapper.c; теперь сборка должна быть успешной.

Решите, где вы хотели бы, чтобы эти файлы (gsl_randist.h и gsl_rnd.h) на персональном компьютере, а также изменять CFLAGS соответственно на домашней версии Makefile.

Как только все это работает отлично, мы можем показать вам, как написать один файл makefile, который будет работать на обеих машинах.

Кроме того, вы можете улучшить свои правила Makefile другими способами, но я должен задать один вопрос первый:

G.o : G.c G.h constants.h utilities.h develop.h 
    $gcc $(CFLAGS) G.c develop.c 

ли G.o действительно требует develop.c? Если это так, вы должны, вероятно, пересмотреть свои исходные файлы, потому что это действительно негигиенично.

+0

Большое спасибо за помощь @Beta. Поэтому я изменил «R_wrapper.c» на своем лабораторном компьютере. чтобы избавиться от всего пути в '#include <...>'. Компиляция не удалась. Затем я изменил файл make, чтобы добавить '-I/opt/local/include/gsl' в' CFLAGS'. Я не знаю, что вы подразумеваете под «Проверяете, что make-файл все еще работает». Я попытался скомпилировать с моим измененным make-файлом на моем лабораторном компьютере, и это не удалось. Затем я отредактировал мой makefile, изменяя '-I/opt/local/include/gsl' на' -I/usr/local/include/gsl', потому что на моем лабораторном компьютере папка gal находится в '/ usr/local/include/gsl '. –

+0

'-I/opt/local/include/gsl' - это расположение папки' gsl' на моем компьютере. Поэтому я застрял здесь в вашей процедуре. –

+0

@ Remi.b: Я думаю, вы пропустили шаг. ** «Отмените изменение и подтвердите, что он работает снова». ** То есть верните исходную версию 'R_wrapper.c' (содержащую пути) и убедитесь, что система сборки работает снова. * Затем * попробуйте добавить '-I/opt/local/include/gsl' в' CFLAGS'. Маленькие шаги. – Beta