IT TIP

라이브러리를 포함하려고하지만 '정의되지 않은 참조'메시지가 계속 표시됩니다.

itqueen 2020. 12. 9. 22:06
반응형

라이브러리를 포함하려고하지만 '정의되지 않은 참조'메시지가 계속 표시됩니다.


libtommath 라이브러리를 사용하려고합니다. Ubuntu Linux에서 내 프로젝트에 NetBeans IDE를 사용하고 있습니다. 라이브러리를 다운로드하고 빌드했으며 결과 .a 파일을 / usr / lib /에 넣고 .h 파일을 / usr / include에 넣는 'make install'을 수행했습니다.

파일을 적절하게 찾는 것 같습니다 (/ 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로 컴파일되었는지 확인했습니다.

추가하기 위해 편집 :

직접 컴파일하고 -l 또는 -L로 라이브러리를 추가하면 동일한 오류가 발생합니다.

$ 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 예제에서 라이브러리가 발견됩니까? 도서관을 찾을 수없는 경우 어떻게 도서관을 찾을 수 있습니까? / usr / lib에 있으며, 현재 디렉토리의 .a 파일로 시도했습니다. 설정해야하는 환경 변수가 있습니까? 그렇다면 방법 등

나는 완전히 다른 라이브러리 (GMP)를 시도했고 똑같은 문제가있었습니다. 이게 우분투 환경 문제일까요? 누구든지 이것을 고치는 방법을 알고 있습니까?


여기서 트릭은 컴파일하는 모듈 뒤에 라이브러리를 배치하는 것입니다. 문제는 참고 물입니다. 링커는 참조를 순서대로 확인하므로 라이브러리가 모듈이 컴파일되기 전에있을 때 링커는 혼란스러워지고 라이브러리의 함수가 필요하다고 생각하지 않습니다. 모듈 뒤에 라이브러리를 배치하면 링커가 모듈의 라이브러리에 대한 참조를 확인합니다.


예, 소스 파일 / 오브젝트 파일 뒤에 라이브러리를 추가해야합니다. 이 명령은 문제를 해결합니다.

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

.c 소스 파일이 .cpp (예 : parsec)로 변환되면 extern 뒤에 "C"가 와야합니다.

extern "C" void foo();

참고 URL : https://stackoverflow.com/questions/1517138/trying-to-include-a-library-but-keep-getting-undefined-reference-to-messages

반응형