2014-11-07 6 views
2

나는 잘 작동해야하는 기존의 C 코드 (다른 사람이 코딩 함)를 가지고 있으며 컴퓨터를 컴파일하고 실행하려고합니다. 나는 다음과 같은 메시지가 메이크와 실행 만들려고 할 때 :컴파일 .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)를 다시 설치하려고하지만 오류 메시지가 남아있다. 내 오류 메시지를 검색 할 때 많은 조회수를 볼 수 있지만 지금까지 아무런 도움이되지 못했습니다.

메이크

여기 내 메이크입니다 :

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을 추가했습니다. 기본적으로 cli 디렉토리에있는 metapopulation.c라는 파일에 내 함수 int main{}이 있습니다. libs 디렉토리에는 다른 모든 .c 및 .h 파일이 들어 있습니다. 그들은 libraries 함수에 의해 libraries 디렉토리에 컴파일되고 호출됩니다.

+2

라이브러리에 링크 했습니까? 연결하는 데 사용하는 명령 줄을 표시하십시오. –

+0

@ PaulGriffiths 의견을 보내 주셔서 감사합니다. 내 업데이트 된 질문보기 희망이 당신이 요구했던 것입니다. Bash에서는 명령 행'make cli_exec'를 사용합니다. 'libraries' 함수는 잘 작동하는 것처럼 보입니다.'cli-exec'에 대해서만 에러를받습니다. 어떻게 든'gsl' 디렉토리에 링크해야합니까? 나는 실제로 각 .c 파일의'gsl' 디렉토리에'#include '를 써서 링크했습니다. –

+1

링커에'-lgsl'을 넘겨주고 있는지 확인하고' -L/path/to/libgsl'이 라이브러리 검색 경로에 있습니다. (그래야하지만 확인하십시오.) –

답변

3

Makefile의 어느 곳에서나 lgsl에 대한 특정 참조가 표시되지 않습니다. 당신이 libgsl으로 빌드 할 때, 최소 컴파일 문자열 :

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

-lgsllibgsl에 실행 파일을 연결하는 링커 ld (즉, 자동으로 GCC 후라고합니다)를 알려줍니다. 나는 네가 그 일을하는 곳을 보지 못했다. Makefile에서 -o cli_exec 뒤에 -lgsl을 추가하면 제대로 작동합니다. 예 :

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

감사합니다. @DavidCRankin –