2012-11-06 1 views
2

ICU 49 및 50 용 정적 라이브러리를 만들었지 만 둘 중 하나와 연결할 때 아래의 것과 같은 667 링커 오류가 발생합니다. 디버깅에 어떻게 접근하여 문제가 무엇인지 파악할 수 있습니까? ICU 지원 목록에는 전혀 도움이되지 않았습니다. 기능은 실제와 정적 libs와에 정의되어 있다고 생각하는 날 리드링커 오류를 디버깅하는 방법? ICU를 정적으로 링크 할 때 정의되지 않은 참조 오류 가져 오기

nm -A libicu* | grep u_charDigitValue_50 
libicui18n.a:unum.ao:     U u_charDigitValue_50 
libicui18n.a:decimfmt.ao:     U u_charDigitValue_50 
libicui18n.a:dcfmtsym.ao:     U u_charDigitValue_50 
libicui18n.a:ucol.ao:     U u_charDigitValue_50 
libicui18n.a:regexcmp.ao:     U u_charDigitValue_50 
libicui18n.a:rematch.ao:     U u_charDigitValue_50 
libicui18n.a:uregex.ao:     U u_charDigitValue_50 
libicui18n.a:tzfmt.ao:     U u_charDigitValue_50 
libicuuc.a:uchar.ao:0000000000000000 T u_charDigitValue_50 
libicuuc.a:rbbiscan.ao:     U u_charDigitValue_50 

(하지만 난 전문가는 아니지만) :

clang++ -ccc-gcc-name g++ -Wl,-E -o velocity main.o city.o auto_lua.o 
obj_builder.o index.o obj.o str.o db.o datetime.o msg_parser.o 
task_scheduler.o gc.o global_settings.o transaction.o schema.o 
skip_node.o util.o thread_context.o hashtable_base.o attr.o 
page_pool.o result_buffer.o server_epoll.o logging.o test_server.o 
test_main.o  -L../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -lc++ 
-lllalloc -lluajit -ldl -lm -lrt -lboost_system -lboost_filesystem 
-licuuc -licui18n -licudata -lgtest 
../lib/libicui18n.a(ucol.ao): In function `uprv_new_collIterate_50': 
ucol.cpp:(.text.uprv_new_collIterate_50+0x37): undefined reference to 
`icu_50::UMemory::operator new(unsigned long)' 
ucol.cpp:(.text.uprv_new_collIterate_50+0xd2): undefined reference to 
`icu_50::UMemory::operator delete(void*)' 
../lib/libicui18n.a(ucol.ao): In function `uprv_delete_collIterate_50': 
ucol.cpp:(.text.uprv_delete_collIterate_50+0x2f): undefined reference 
to `icu_50::UMemory::operator delete(void*)' 
../lib/libicui18n.a(ucol.ao): In function `initializeFCD(UErrorCode*)': 
ucol.cpp:(.text._ZL13initializeFCDP10UErrorCode+0x2c): undefined 
reference to `icu_50::Normalizer2Factory::getNFCImpl(UErrorCode&)' 
../lib/libicui18n.a(ucol.ao): In function `ucol_initCollator_50': 
ucol.cpp:(.text.ucol_initCollator_50+0x126): undefined reference to 
`utrie_unserialize_50' 
../lib/libicui18n.a(ucol.ao): In function `ucol_prv_getSpecialCE_50': 
ucol.cpp:(.text.ucol_prv_getSpecialCE_50+0x9f6): undefined reference 
to `u_charDigitValue_50' 
ucol.cpp:(.text.ucol_prv_getSpecialCE_50+0xc1f): undefined reference 
to `u_charDigitValue_50' 

내가 이것을 볼 컴파일 된 정적 라이브러리에 nm의 실행 올바른 이름 (두 번째 줄은 아래쪽에서 붙여 넣기 오류의 맨 아래에있는 누락 된 기호의 이름과 일치합니다.)

U_STATIC_IMPLEMENTATION = 1을 정의했으며 clang과 gcc 모두에서 49와 50을 모두 컴파일하려고했습니다. 나는 우분투 x64 시스템에있어. 정적 라이브러리를 빌드 한 후 확인하면 모든 테스트가 통과됩니다. 계속 진행하는 방법에 관해서는 손실이 있습니다. 내가 시도 할 수있는 아이디어는 없나요?

답변

11

정적 라이브러리를 다루는 경우 링크 순서 문제 일 수 있습니다.

의존성의 역순으로 .a libs를 사용하여 링커를 호출 해보십시오.

+0

당신이 옳았는데, 나는 주문을 시도했다. "-licui18n -licuuc -licudata"는 이제 효과적이다. (나는 링크 할 때 다른 순서를 썼다.) 창문에서 나는 명령이 중요하다는 것을 몰랐다. (msvc에서는 그렇지 않습니다.) 대단히 감사합니다! – Eloff

+0

공유 라이브러리에서는 그렇지 않습니다. 그러나 정적 라이브러리를 사용하면 링커가 매우 까다 롭습니다. .l에 ranlib를 실행하여 나중에 링커에서 사용하는 기호 색인 테이블을 만드는 것도 도움이 될 수 있습니다. – onitake

+0

대답은 정확하게 맞습니다. 우리는 샘플을 정적 빌드를 위해 올바른 순서로 링크하기 위해 수정하기 시작 했으므로 잘못된 링크 줄이 적어지기를 바랍니다. –

관련 문제