2011-05-02 6 views
2

문제점에 대한 해결책을 찾고 단서를 찾았지만 일관된 해결책을 찾지 못했습니다. 동적 라이브러리 (libdyna.so) 코드가 있습니다.), 3 statics 라이브러리 (libone.a, libtwo.a, libthree.a) 및 log4cpp 라이브러리의 기능을 사용합니다. 그리고 처음에는 모든 것이 잘 보였을 때 libdyna.so를 만들 수 있었지만 래퍼 (jni 래퍼가 잘 작동 함)를 사용하여 Java 테스트 프로그램에서 테스트했을 때 많은 정의되지 않은 참조가있었습니다. 동적 라이브러리 정적 라이브러리를 사용합니다. 정의되지 않은 심볼이 나타납니다.

는 다음 나는 메이크 파일에 "-z의 인증 된 정의"플래그를 넣어 정의되지 않은 참조가 많이 나타나고 내가 다시 동적 라이브러리를 컴파일 할 수 있습니다.

나는 세 가지 정적 라이브러리와 함께 '나노'명령을했습니다 그리고 내가 제대로 다이나 lib에 사용하는 모든 기능을 보냅니다. 그러나 3 개의 정적 라이브러리를 포함하는 'libdyna.so'를 nm으로 만들었을 때 정의되지 않은 기호 (함수)가 발견되었습니다.

은 내가 동적 하나를 만들어 할 때 솔루션은 링커에 몇 가지 플래그를 추가하는 식으로 뭔가를해야한다고 생각하지만, 난 정말 모르겠어요. 누구나 나를 도울 수 있습니까, 아니면 저에게 몇 가지 아이디어를 말해 줄 수 있습니까?. 일부 코드가 필요한 경우 알려 주시면 여기에 붙여 드리겠습니다. 고마워요.

P/d를 내 나쁜 영어 죄송합니다. 당신은이 모든 정적 라이브러리를 포함합니다 링커 옵션 --whole-archive을 사용할 수있는 라이브러리가 매우 큰이 될 수 있지만 아마도, 문제를 해결할 수

+0

오 마이 갓. 나는 당신을 믿을 수 없다 미해결 된 상징의 이름을 포함하지 않았다! 그것들을 추가 할 순간을 찾아 주시겠습니까? 기호를 알고있는 경우 가장 자주 이것은 3 초 응답입니다. – sehe

+0

정적 라이브러리를 추가하려고 했습니까? Sth는 -l/path/libtwo.a와 비슷하게 다른 두 개는 ... –

답변

3

. --whole 아카이브 옵션 다음 명령 줄에 언급 된 각 아카이브에 대한

man ld:

g++ -shared -o libdyna.so dyna.o -Wl,-whole-archive -la -lb -lc -Wl,-no-whole-archive 
, 모든 객체 링크에서 아카이브 파일이 아닌에 대한 아카이브를 검색을 포함 필수 오브젝트 파일. 일반적으로 아카이브 파일을 공유 된 라이브러리로 변환하여 모든 객체를 결과 공유 라이브러리에 포함시킵니다.

닫기 -Wl,-no-whole-archive을 잊지 마세요. 또한

확인 GCC 명령 행에서 라이브러리로 나타나는 순서, 그들은 그렇지 않으면 링커를로드 할 수 없습니다, 동적 라이브러리의 오브젝트 파일을 쫓고 있는지 확인하십시오. libone이 예를 들어 libtwo를 사용한다면 libton이 libtwo 앞에 나타나야합니다. 그것은 당신의 문제에 대한 대안의 해결책이 될 수 있습니다.