46

libtommath 라이브러리를 사용하려고합니다. 우분투 리눅스에서 NetBeans IDE를 사용하고 있습니다. 나는 라이브러리를 다운로드하고 빌드했는데, 결과를 얻는 .a 파일을/usr/lib /에 넣고 .h 파일을/usr/include에 넣었다.라이브러리를 포함하려하지만 '정의되지 않은 참조'메시지가 계속 표시됨

파일을 찾는 중이다. 적절하게 (나는 더 이상 그 오류를 얻지 못하기 때문에, 나는/usr 디렉토리에 설치하기 전에 그렇게했다.) 나는 (라이브러리에있는) mp_init를 호출하는 간단한 주요 만들 때 내 사업을 시도 할 때

그러나, 나는 다음과 같은 오류가 발생합니다 : 그래서

mkdir -p build/Debug/GNU-Linux-x86 
rm -f build/Debug/GNU-Linux-x86/main.o.d 
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c 
mkdir -p dist/Debug/GNU-Linux-x86 
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o 
build/Debug/GNU-Linux-x86/main.o: In function 'main': 
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init' 
collect2: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1 

을, 그것과 같다 링커는 라이브러리 내에서 함수를 찾을 수 없지만 거기에 있습니다. 그래서이 문제의 원인이 무엇인지 모릅니다.

gcc 명령을 직접 입력하고 makefile을 건너 뛰어도 동일한 오류가 발생합니다. 또한 정적 라이브러리가 gcc로 컴파일되었는지 확인했습니다. 그래서,

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a 
collect2: ld returned 1 exit status 

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

나는이 물건에 매우 녹슨입니다 : 내가 직접 컴파일을 할 경우

나는이 같은 오류를 얻을 -l 또는 -L와 라이브러리를 추가

편집 추가하기 나는 여기서 올바른 명령을 사용하고 있는지 확신하지 못한다. -L 예에서 발견 된 라이브러리는 무엇인가? 라이브러리가 발견되지 않으면 어떻게하면 라이브러리를 찾을 수 있습니까?/usr/lib에 있는데, 현재 디렉토리의 .a 파일로 시도했습니다. 설정해야 할 환경 변수가 있습니까? 그렇다면, 어떻게, 등

나는 완전히 다른 라이브러리 (GMP)를 시도하고 정확히 같은 문제가있었습니다. 이것은 일종의 우분투 환경 문제가되어야합니까? 누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

113

여기 트릭은 컴파일하는 모듈에 라이브러리를 두는 것입니다. 문제는 참고 사항입니다. 링커는 참조를 순서대로 해석하므로 라이브러리가 모듈을 컴파일하기 전이면 링커가 혼동을 느끼고 라이브러리의 함수가 필요하지 않다고 생각합니다. 라이브러리를 모듈 뒤에 놓으면 모듈의 라이브러리에 대한 참조가 링커에 의해 해결됩니다.

+7

+1 오, 고마워! 링크 해결 순서가 완벽하다는 것을 알고 있지만, 사실 이러한 사실을 상기시키는 데 도움이됩니다! – scraimer

+1

이것은 나를 위해 일했습니다. 내 아주 오래된 makefile이 작동하는 데 사용되었지만, 이제는 컴파일러가 자신의 이익을 위해 너무 똑똑해지고있는 것 같습니다 :) –

+2

감사합니다. –

35

예, 소스 파일/오브젝트 파일 다음에 라이브러리를 추가해야합니다. 이 명령은 문제가 해결됩니다 다음이 .c 소스 파일 (파섹에서와 같은) .CPP을 변환하는 경우

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath 
+1

'libtommath.a'와 연결하는 올바른 방법을 쓰려고 +1했습니다. – scraimer

+0

와우, 이것은 꽤 까다 롭습니다. 그 점을 지적 해 주셔서 감사합니다. – lolski

4

를, 다음 통근는 같이 "C"다음에 할 필요가

extern "C" void foo(); 
관련 문제