2013-07-18 2 views
4

공유 라이브러리를 작성하고 링크를 시도하여 최종 실행 파일을 만들려고했습니다. 다음은 메이크Makefile 공유 라이브러리와 연결에 실패했습니다.

mystring.out:main.c libmystring.so 
    gcc -I. -L/home/pradheep/myexploration/mystring/ -lmystring main.c -o mystring.out 

libmystring.so:mystring.o 
    gcc -shared -Wl,-soname,libmystring.so -o libmystring.so mystring.o 

libmystring.a:mystring.o 
    ar -r libmystring.a mystring.o 

mystring.o:mystring.h mystring.c 
    gcc -Wall -g -c -fPIC -I. mystring.c 

clean: 
    rm *.o 
    rm *.a 
    rm *.so 
    rm *.out 

는 오류 메시지입니다 :

gcc -I. -L/home/pradheep/myexploration/mystring/ -lmystring main.c -o mystring.out 
/tmp/ccS9UDPS.o: In function `main': 
main.c:(.text+0x2d): undefined reference to `mystrcpy' 
main.c:(.text+0x5a): undefined reference to `mystrncpy' 
main.c:(.text+0x87): undefined reference to `mystrncpy' 
main.c:(.text+0xa4): undefined reference to `mystrlen' 
collect2: ld returned 1 exit status 
make: *** [mystring.out] Error 1 

나는 이미 내 libmystring.so의 LD_LIBRARY_PATH

echo $LD_LIBRARY_PATH 
/home/pradheep/myexploration/mystring 

출력을 내 보낸

000004ca T mystrncpy 
0000045c T mystrcpy 

내가 무엇이 누락 되었습니까?

해결책 :

문제는 라이브러리 -l 사용 순서입니다. 이 파일은 소스 파일 다음에 사용해야하며 Dayal rai가 가리키는 올바른 순서는 gcc -I입니다. -L/home/pradheep/myexploration/mystring/main.c -lmystring -o mystring.out 그리고 그것이 작동합니다.

+0

mystring.h를 main.c 파일에 포함 시켰습니까? – Omkant

+0

예. 내가 추가했습니다 ... 같은 사실은 명령 줄에서 작동합니다. – Pradheep

+1

@Omkant 헤더 파일은 링커 오류와 아무 관련이 없습니다. 중요한 것은'-lmystring' 링커 플래그의 위치입니다. –

답변

5

링커의 일반적인 동작은 명령 줄에 지정된 라이브러리에서 왼쪽에서 오른쪽으로 외부 함수를 검색하는 것입니다. 즉, 함수의 정의가 들어있는 라이브러리는이를 사용하는 소스 파일이나 오브젝트 파일 다음에 나타나야합니다.

+0

당신은 자리에 있습니다. 나는 같은 것을 몰랐다. 규칙을 gcc -I로 변경. -L/home/pradheep/myexploration/mystring/main.c -lmystring -o mystring.out이 마술을했습니다. 나는이 어리석은 실수를하고 있다는 것을 전혀 몰랐습니다. 질문에서 업데이트 할 수도 있습니다. – Pradheep

+0

새 섹션을 추가했습니다. 대답은 분명 누군가가 같은 찾고 :) 감사합니다 – Pradheep

+0

도와 드리겠습니다 :) –

관련 문제