문제점이 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
파일을 충족 좋아하지?
문제는 내 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
원형이 아니 어서 디자인을 수정하거나 "라이브러리"를 오브젝트 파일의 모음으로 취급하고이를 아카이브에 넣지 마십시오. 이 같은 디자인은 예를 들어 Windows로 포팅 될 수 없습니다. –