2016-10-12 1 views
0

문제점이 this question과 매우 유사합니다. 나는 심볼을 참조하는 것이 만들어진 것처럼 보이지만 정적 링커를 추가하도록 링커에게 알려줄 필요가있다. 그 이유는 라이브러리에 .init에 함수가 있거나 (__attribute__ ((constructor))) 초기화를 수행하는 데 사용되며, 이는 차례대로 기본 프로그램에서 register() 함수를 호출하여 해당 기능을 등록합니다 (read : other 함수 포인터).autools, libtool and -Wl, -whole-archive

주 프로그램에서 라이브러리의 기호가 사용되지 않는 것처럼 보이지만 주 프로그램은 라이브러리 초기화 함수를 통해 라이브러리를 등록하자마자 라이브러리에서 함수를 호출합니다. 의 "를

bin_PROGRAMS = pktanon 
pktanon_SOURCES = main.cpp 
pktanon_DEPENDENCIES = $(lib_LIBRARIES) 
pktanon_LDADD = libpktanon.la $(LDADD) 

참고"라 "확장 대신 :

하지만 그래서 이전 했나요 질문에 주어진 예를 복용 ... libtool을 사용하고, 내가 좋아하는 뭔가를 쓸 필요 것 "lib 디렉토리.

이제는 --whole-archive 옵션을 링커에 전달해야합니까? the question에 제안 된 답변은 아카이브 (.a 파일)에 대한 경로를 알고 있다고 가정합니다. Makefile.am에서 .libs/libptanon.a와 같은 경로를 하드 코딩하는 것이 적절하지 않다고 생각합니다. 그리고 링커는

pktanon_LDFLAGS = -Wl,--whole-archive,libpktanon.la,--no-whole-archive 

어떤 제안 : 시도하는 경우는 전체 아카이브 otpion에 .la 파일을 충족 좋아하지?

답변

0

--whole-archive를 사용할 수 없으므로 대신 Libtool 편의 라이브러리를 만들지 않으시겠습니까? Automake Makefile.am에서 noinst_를 라이브러리에 추가 한 다음 정적 아카이브가 아닌 정적 아카이브를 작성하는 대신 라이브러리의 모든 오브젝트 파일을 가져 와서 링크 된 모든 것에 추가하십시오. 이식성이 있으며이 경우에는 작동해야합니다. 라이브러리가 전혀 필요없는 것처럼 보이지는 않습니다.

+0

문제는 내 lib가 주 프로그램의 기호를 반대로 사용하지 않는다는 것입니다. autotools는 편의 라이브러리 libs가 주 프로그램 P가 참조하는 기호를 정의한다고 가정합니다. autotools는 P와 L을이 순서로 링커에 전달합니다. --whole-archive (또는 --start-group) 옵션이 없으면 링커는 L과 P를 "교차 링크"하지 않습니다. 내 경우 L은 P의 기호를 참조합니다. P는 L이 참조하는 기호를 정의합니다. autotools 가정의 반대입니다. 이 사람은 동일한 문제가 있습니다. http://lists.gnu.org/archive/html/automake/2006-03/msg00042.html 포인트 II (동기 부여) 섹션 3을 참조하십시오. – user1159290

+0

원형이 아니 어서 디자인을 수정하거나 "라이브러리"를 오브젝트 파일의 모음으로 취급하고이를 아카이브에 넣지 마십시오. 이 같은 디자인은 예를 들어 Windows로 포팅 될 수 없습니다. –

관련 문제