2014-11-07 4 views
2

У меня есть уже существующий код C (закодированный кем-то другим), который должен работать нормально, и я просто пытаюсь его скомпилировать и запускать на своем компьютере. Когда я пытаюсь создать исполняемый файл с Makefile я получаю следующее сообщение:компиляция .c: Неопределенные символы для архитектуры x86_64

Undefined symbols for architecture x86_64: 
    "_gsl_ran_binomial", referenced from: 
     _develop in develop.o 
     _developAllRNAs in develop.o 
     _developWithFeedback in develop.o 
    "_gsl_ran_exponential", referenced from: 
     _randomOrg in G.o 
     _mutateBigK in G.o 
     _rpois in develop.o 
    [And some other gsl_related issues] 
    "_gsl_rng_uniform_int", referenced from: 
     _randomOrg in G.o 
     _mutateTrait in G.o 
     _mutateDBM in G.o 
     _substitutions in G.o 
     _makeGamete in G.o 
ld: symbol(s) not found for architecture x86_64 

Я попытался переустановить gsl (sudo port install gsl), но остается сообщение об ошибке. Я вижу много хитов, когда я отправляю сообщение об ошибке, но до сих пор ничего не помогало.

Makefile

Вот мой Makefile:

LIBS = libs 
INCLUDE_PATH=libs/ 

cli_exec: libraries 
    gcc cli/makepopulation.c $(wildcard libraries/*) -I$(INCLUDE_PATH) -o cli_exec 

libraries: 
    mkdir libraries/ 
    for dir in $(LIBS); do \ 
     cd $$dir; \ 
     gcc -c *.c -I../; \ 
     mv *.o ../libraries; \ 
     cd -; \ 
    done 


clean: 
    rm -rf libraries/ make_exec 

Я своего рода скопировать вставили эту Makefile, что я нашел в Интернете и не получить много. Я редактировал свой вопрос, чтобы добавить мой make-файл. В принципе, моя функция int main{} в файле metapopulation.c, который находится в каталоге cli. каталог libs содержит все остальные файлы .c и .h. и они скомпилированы и вызваны .o в каталоге с именем libraries функцией libraries.

+2

Вы ссылаетесь на эту библиотеку? Покажите командную строку, которую вы используете для связи. –

+0

@PaulGriffiths Спасибо за ваш комментарий. См. Мой обновленный вопрос. Надеюсь, это то, о чем вы просили. В Bash в командной строке 'make cli_exec'. Функция 'libraries', кажется, работает нормально, я получаю сообщение об ошибке для' cli-exec'. Должен ли я каким-либо образом ссылаться на мой каталог 'gsl'? Я действительно связан с каталогом 'gsl' в каждом .c файле, написав' #include ' –

+1

Подтвердите, что вы передаете' -lgsl' в компоновщик и что ' -L/path/to/libgsl' находится в пути поиска библиотеки (должно быть, но проверьте) –

ответ

3

Я не вижу конкретной ссылки на lgsl в любом месте вашего Makefile. Когда вы строите с libgsl, минимальная строка компиляции является:

gcc -Wall -Wextra -o progname progname.c -lgsl 

-lgsl говорит компоновщик ld (который вызывается после того, как GCC автоматически), чтобы связать исполняемый libgsl. Я не вижу, где вы это делаете. В Makefile просто добавьте -lgsl после -o cli_exec, и это должно сработать. Например:

gcc cli/makepopulation.c $(wildcard libraries/*) -I$(INCLUDE_PATH) -o cli_exec -lgsl 
+0

Большое спасибо @DavidCRankin –

Смежные вопросы