-static 옵션을 사용해서 컴파일할때 관련 라이브러리들이 모두 정적으로 되어있어야 하나요?
curl, iconv, mysql 라이브러리를 사용하는 프로그램을 개발중입니다. 개발 환경이 갖춰지지 않은 서버에서 테스트 해보려고 프로그램을 정적으로 컴파일하려고 하는데요.. autotools 사용중이고 configure 할때 LDFLAGS에 -static을 넣어줬습니다. 그런데 마지막 링킹 과정에서 에러가 발생합니다.
gcc -I/usr/local/include/curl -I/usr/local/mysql/include/mysql -Wall -g -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DCONFIG_FILE_PATH="\"/usr/local/etc\"" -L/usr/local/mysql/lib/mysql -static -o msn_bot main.o config_file.o connection.o global.o md5.o show_msg.o -lnsl -lsocket -lm -liconv -lcurl -lmysqlclient -lz
일단 첫번째 문제는 iconv 라이브러리를 못찾는다는 에러인데요. PATH 안에 .so 파일은 있는데 .a가 없었습니다. 그래서 iconv를 정적으로 컴파일해서 .a를 만들어놓고 두번째 시도에서..
curl 라이브러리가 ssl을 동적으로 링크시켰는지 ssl 관련 함수 레퍼런스 에러가 무수히 많이 나오더군요. 그래서 ssl 관련 정적 파일들을 커맨드라인에 적어줬더니 넘어 가더군요.
마지막으로 발생한 에러들이 socket, nsl 관련 함수들 레퍼런스 에러가 나왔습니다. 일단 여기까지 하다가 예전 게시판을 검색을 해봤는데요..
어떤 분은 gcc에 -static 옵션을 쓰면 알아서 정적으로 다 땡겨와서 바이너리 떡하니 만들어준다는 분도 있고.. 어떤 분은 -static 옵션을 써도 라이브러리가 정적으로 컴파일 되어 있지 않으면 안된다는 분도 있더군요. 일단 저는 후자의 문제에 부딪힌것 같은데요.
필요한 라이브러리를 모두 정적으로 컴파일해서 그 파일들을 링크 시킬때 적어줘야만 제 프로그램을 정적으로 컴파일 할 수 있는건가요? 아니면 -static 옵션으로 한방에 되는걸 제가 뭔가 잘못해서 그런건가요?
제가 이래저래
제가 이래저래 삽질해본바 결론은 필요한 라이브러리를 다 링커에게 알려줘야 된다는겁니다. 그런데 아직도 이해가 안되는게 *.a 파일은 이미 정적으로 컴파일이 된건데 왜 이 파일에서 외부 라이브러리가 필요하다고 하는지 모르겠네요. 정적으로 컴파일 되었다는건 공유라이브러리에 의존성이 없다는거 아닌가요?
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
*.a는
*.o 들을 ar 한 겁니다.
*.o 들이 내부적으로 dynamic(혹은 PIC) 일 수도 있고 그렇지 않을수도 있습니다.
*.o들이 각각 외부의 *.so을 물 수도 있습니다.
실행파일을 만들때의 -static 은 실행파일이 외부적으로 so 참조가 없다는걸 말합니다.
댓글 달기