프로그램 사용/gcc2019.06.21 17:40

예전글에서 누락된 부분인데..

-l로 링커에 넘겨서 붙일 녀석들은 왜인지 모르겠지만 가장 마지막에 옵션을 주어야 한다.

 

아래처럼 파일명 이후에 -l을 넣어주면 문제없이 되는데

$ gcc -I/usr/include/libxml2 reader2.c  -lxml2 

 

-l 이후에 파일명을 넣으면 해당 파일을 찾을수 없다고 나온다.

(그냥 테스트 해보면 -lxml2를 넣지 않은것과 동일하다)

$ gcc -I/usr/include/libxml2 -lxml2 reader2.c
/tmp/ccUmEsNl.o: In function `processNode':
reader2.c:(.text+0x19): undefined reference to `xmlTextReaderConstName'
reader2.c:(.text+0x3b): undefined reference to `xmlTextReaderConstValue'
reader2.c:(.text+0x4b): undefined reference to `xmlTextReaderHasValue'
reader2.c:(.text+0x5a): undefined reference to `xmlTextReaderIsEmptyElement'
reader2.c:(.text+0x69): undefined reference to `xmlTextReaderNodeType'
reader2.c:(.text+0x77): undefined reference to `xmlTextReaderDepth'
reader2.c:(.text+0xb8): undefined reference to `xmlStrlen'
/tmp/ccUmEsNl.o: In function `streamFile':
reader2.c:(.text+0x11d): undefined reference to `xmlReaderForFile'
reader2.c:(.text+0x138): undefined reference to `xmlTextReaderRead'
reader2.c:(.text+0x155): undefined reference to `xmlTextReaderRead'
reader2.c:(.text+0x16a): undefined reference to `xmlTextReaderIsValid'
reader2.c:(.text+0x19a): undefined reference to `xmlFreeTextReader'
/tmp/ccUmEsNl.o: In function `main':
reader2.c:(.text+0x209): undefined reference to `xmlCheckVersion'
reader2.c:(.text+0x221): undefined reference to `xmlCleanupParser'
reader2.c:(.text+0x226): undefined reference to `xmlMemoryDump'
collect2: error: ld returned 1 exit status

 

머지?

foo.o -lz bar.o일 경우

foo.o는 libz가 로드 되지만, bar.o 에서는 libz가 로드되지 않는다?

-llibrary
-l library
Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)
It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.

The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.

The directories searched include several standard system directories plus any that you specify with -L.

Normally the files found this way are library files---archive files whose members are object files. The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined. But if the file that is found is an ordinary object file, it is linked in the usual fashion. The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.

[링크 : https://linux.die.net/man/1/gcc]

'프로그램 사용 > gcc' 카테고리의 다른 글

gcc의 linker 옵션 은 가장 끝에  (0) 2019.06.21
c large file support  (0) 2019.06.21
gcc5 atoi / stoi  (0) 2019.06.14
gcc variadic macro  (0) 2017.06.20
문자열에 escape 로 특수문자 넣기  (0) 2017.06.19
gcc cpp type (유니코드 문자열)  (0) 2017.04.04
Posted by 구차니

댓글을 달아 주세요