2014-03-25 3 views
1

나는 gccar이라는 정적 라이브러리 libstuff.a을 만들었습니다. 라이브러리를 /custom/lib/dir/에, 헤더 파일을 /custom/include/dir/에 설치했습니다. 아카이브에 대해 다른 응용 프로그램을 컴파일하려고하면 문제가 발생합니다.정적 라이브러리에 대한 컴파일 문제

기본적으로 컴파일하려고하는 응용 프로그램은 gcc -L/custom/lib/dir/ -I/custom/include/dir/ -lstuff을 사용합니다.

컴파일을 시도하면 stuff.h에 선언 된 함수에 대해 오류가 발생하고 stuff.c에 정의됩니다. 내가 /custom/lib/dir/에서 libstuff.a를 제거하면

main.c:51: undefined reference to `stuff_init' 
collect2: error: ld returned 1 exit status 

컴파일러는 /usr/bin/ld: cannot find -lstuff를 뿌려줍니다. 내가 다시 돌려 놓으면 불평을하지 않는다. 따라서 아카이브를 올바르게 찾는 것입니다.

main.c gcc에서 #include "stuff.h" 코드를 제거하면 약 stuff_init이라는 메시지가 표시되어 헤더가 올바르게 검색됩니다.

nm libstuff.a을 실행하면 출력은 0000000000000000 T stuff_init입니다. 따라서 함수는 아카이브 파일에 정의됩니다.

그래서 내가 뭘 잘못하고 있니?

+0

공유 라이브러리는'àr (1)'로 생성되지 않고'libfoo.a'는 * 정적 * 라이브러리입니다. 빌드 지침을 확인하십시오. – vonbrand

+0

죄송합니다. 공유 대신 정적으로 말하려고합니다. 감사합니다 :) – Josh

+0

당신은 정말로 정확하고 완전한 연결 명령 줄을 보여 주어야합니다. "기본적으로"괜찮지 만 충분히 구체적인 것은 아닙니다. –

답변

5

당신은 당신의 정확한 연결 라인을 표시하지 않습니다,하지만 기회는 당신이해야 있습니다 (하지만하지 않음) 오브젝트 파일 후 라이브러리를 나열 :

gcc -o program main.o -L/custom/lib/dir -lstuff 

외부에서 하나 개 이상의 오브젝트 파일이 있다면 그런 다음 라이브러리 앞에 모든 것을 나열하십시오. -L 옵션은 지정된 디렉토리의 라이브러리를 사용하는 -llib 옵션 이전의 어느 위치로든 이동할 수 있습니다.

+0

그게 해결 됐어. 내 객체 파일 앞에'-l'과'-L' 플래그가 나타났습니다. 감사! – Josh

관련 문제