2013-05-10 4 views
1

와의 Xerces-C 정적 라이브러리와 링크 할 수 없습니다 내 Makefile 는 g ++

CC := gcc 
CXX := g++ 
CXXFLAGS := -O3 
LDFLAGS := -O3 

CXXFLAGS += -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include 
CXXFLAGS += -DXERCES_STATIC_LIBRARY 
LDFLAGS += -L/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib 
LDFLAGS += -Bstatic 
LDFLAGS += -lxerces-c 

ReadXML: DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o 

clean: 
    @rm -rvf *.o ReadXML 

같은 make 명령은 잘 작동 그래서 내가이 다음
$ ls -1 /users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib 
libxerces-c-3.1.so 
libxerces-c.a 
libxerces-c.la 
libxerces-c.so 
pkgconfig 

를 다운로드 및 xerces-c-3.1.1-x86_64-linux-gcc-3.4.tar.gz 압축 해제 .

$ make -B 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o ReadXML.o ReadXML.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o DOM.o DOM.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o MyDOMErrorHandler.o MyDOMErrorHandler.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o MyXMLString.o MyXMLString.cpp 
gcc -O3 -L/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib -Bstatic -lxerces-c ReadXML.o DOM.o MyDOMErrorHandler.o MyXMLString.o -o ReadXML 

하지만 그것은 될 수 있도록 노력하겠습니다으로 ReadXML 실행 결과는 "정적"아니다. 인쇄됩니다

./ReadXML: error while loading shared libraries: libxerces-c-3.1.so: cannot open shared object file: No such file or directory 

까지 내가 setenv LD_LIBRARY_PATH /users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib입니다. 분명히, xerces-c는 동적으로 링크됩니다.

-Bstatic이 정적 링크 된 실행 파일을 만드는 데 도움이되지 않는 이유는 무엇입니까?


업데이트는 2013년 5월 13일

n.m @ 따랐다. '이의 조언과

gcc -O3 -L/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib -Wl,-Bstatic -lxerces-c ReadXML.o DOM.o MyDOMErrorHandler.o MyXMLString.o -o ReadXML 
/usr/bin/ld: cannot find -lgcc_s 
collect2: ld returned 1 exit status 
make: *** [ReadXML] Error 1 

같은 오류가 발생했습니다 그리고 LDFLAGS += -Wl,-Bstatic -lxerces-c -Wl,-Bdynamic로, 나는 @ n.m에 대한 감사를

g++ -O3 -L/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/lib -Wl,-Bstatic -lxerces-c -Wl,-Bdynamic -o ReadXML DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o 
DOM.o: In function `parseXMLFile(char const*)': 
DOM.cpp:(.text+0x3a6): undefined reference to `xercesc_3_1::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)' 
DOM.cpp:(.text+0x3b3): undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager' 
DOM.cpp:(.text+0x3dc): undefined reference to `xercesc_3_1::XMLUni::fgXercesHandleMultipleImports' 
DOM.cpp:(.text+0x3f0): undefined reference to `xercesc_3_1::XMLUni::fgXercesSchema' 
DOM.cpp:(.text+0x404): undefined reference to `xercesc_3_1::XMLUni::fgXercesSchemaFullChecking' 
DOM.cpp:(.text+0x42f): undefined reference to `xercesc_3_1::XMLUni::fgDOMErrorHandler' 
... # Many other lines 
ReadXML.cpp:(.text+0x1eb): undefined reference to `xercesc_3_1::XMLString::release(char**, xercesc_3_1::MemoryManager*)' 
ReadXML.o:(.gcc_except_table+0x28): undefined reference to `typeinfo for xercesc_3_1::XMLException' 
collect2: ld returned 1 exit status 
make: *** [ReadXML] Error 1 

감사

+0

그냥'-Bstatic' 대신'-Wl, -Bstatic'을 시도하십시오. 또한'-v'를 사용하여 g ++가 링커에 전달하는 정확한 옵션을 살펴보십시오. –

+1

좀 더 정확히 말하면'-Wl, -Bstatic -lxerces-c -Wl, -Bdynamic'이라고 말하면 라이브러리를 정적으로 연결하기를 원할 것입니다. 모든 시스템이 * 모든 * 시스템 라이브러리에 대한 정적 링크를 지원하는 것은 아닙니다. –

+0

@ n.m. 귀하의 답변에 감사드립니다. 월요일에해볼거야. BTW, 왜 이것에 대한 답변을 게시하지? –

답변

3

을 얻었다. 도와 줘. libtool에서 조금 공부 한 후 대답을 얻었습니다. 여기에 답변을 게시하겠습니다. 결과가

$ make -B ReadXML 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o DOM.o DOM.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o MyDOMErrorHandler.o MyDOMErrorHandler.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o MyXMLString.o MyXMLString.cpp 
g++ -O3 -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include -DXERCES_STATIC_LIBRARY -c -o ReadXML.o ReadXML.cpp 
g++ -O3 -L/users/jdyu/labs/xerces/xerces-c-3.1.1/lib -o ReadXML DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o -Wl,-Bstatic -lxerces-c -Wl,-Bdynamic -lnsl -lpthread -lcurl 

$ make test 
ldd /users/jdyu/labs/xerces/ReadXML/ReadXML 
    linux-vdso.so.1 => (0x00007fff6fdd6000) 
    libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003b5e200000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b4ea00000) 
    libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x0000003b5f200000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003b54e00000) 
    libm.so.6 => /lib64/libm.so.6 (0x0000003b4e200000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003b54200000) 
    libc.so.6 => /lib64/libc.so.6 (0x0000003b4de00000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000003b4d600000) 
    libidn.so.11 => /lib64/libidn.so.11 (0x0000003b5d200000) 
    libldap-2.4.so.2 => /usr/lib64/libldap-2.4.so.2 (0x0000003b60000000) 
    librt.so.1 => /lib64/librt.so.1 (0x0000003b4f200000) 
    libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x0000003b56a00000) 
    libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003b55e00000) 
    libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003b56600000) 
    libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003b55600000) 
    libz.so.1 => /lib64/libz.so.1 (0x0000003b4ee00000) 
    libssl3.so => /usr/lib64/libssl3.so (0x0000003b61000000) 
    libsmime3.so => /usr/lib64/libsmime3.so (0x0000003b60800000) 
    libnss3.so => /usr/lib64/libnss3.so (0x0000003b5ea00000) 
    libnssutil3.so => /usr/lib64/libnssutil3.so (0x0000003b60400000) 
    libplds4.so => /lib64/libplds4.so (0x0000003b5ca00000) 
    libplc4.so => /lib64/libplc4.so (0x0000003b5c600000) 
    libnspr4.so => /lib64/libnspr4.so (0x0000003b5e600000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003b4e600000) 
    libssh2.so.1 => /usr/lib64/libssh2.so.1 (0x0000003b5de00000) 
    liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x0000003b5fc00000) 
    libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003b4fa00000) 
    libsasl2.so.2 => /usr/lib64/libsasl2.so.2 (0x0000003b5f800000) 
    libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003b57a00000) 
    libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x0000003b55200000) 
    libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000003b55a00000) 
    libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003b56200000) 
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003b5d600000) 
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b4f600000) 
    libfreebl3.so => /lib64/libfreebl3.so (0x0000003b5da00000) 
/users/jdyu/labs/xerces/ReadXML/ReadXML /users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml 
Parsing XML file '/users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml' ... 
Parsing finished in 1 millisecond(s). 
37 nodes found. 
XML platform terminated successfully! 

정적으로 링크 된 xerces-c로 제공

CC := gcc 
CXX := g++ 
LD := g++ 
CXXFLAGS := -O3 
LDFLAGS := -O3 

CXXFLAGS += -I/users/jdyu/labs/xerces/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include 
CXXFLAGS += -DXERCES_STATIC_LIBRARY 
LDFLAGS += -L/users/jdyu/labs/xerces/xerces-c-3.1.1/lib 

ReadXML: DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o 
    $(LD) $(LDFLAGS) -o [email protected] $^ -Wl,-Bstatic -lxerces-c -Wl,-Bdynamic -lnsl -lpthread -lcurl 
test: ReadXML 
    ldd $(abspath $<) 
    $(abspath $<) /users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml 

그리고 다음과 같은

마지막으로 내 Makefile 작업은 보인다.


그리고 libtool은 더욱 고정 할 수 있습니다.

ReadXML_: DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o 
    libtool --tag=CXX --mode=link $(LD) $(LDFLAGS) -o [email protected] $^ -lxerces-c -lnsl -lpthread -lcurl 
test_: ReadXML_ 
    -ldd $(abspath $<) 
    $(abspath $<) /users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml 

와 메이크업 파일을 추가하고 나를 위해 배울 수있는 libtool에서 훨씬 더가있다 결과를

$ make ReadXML_ 
libtool --tag=CXX --mode=link g++ -O3 -L/users/jdyu/labs/xerces/xerces-c-3.1.1/lib -o ReadXML_ DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o -lxerces-c -lnsl -lpthread -lcurl 
libtool: link: g++ -O3 -o .libs/ReadXML_ DOM.o MyDOMErrorHandler.o MyXMLString.o ReadXML.o -L/users/jdyu/labs/xerces/xerces-c-3.1.1/lib /users/jdyu/labs/xerces/xerces-c-3.1.1/lib/libxerces-c.so -lnsl -lpthread -lcurl -Wl,-rpath -Wl,/usr/local/lib 

$ make test_ 
ldd /users/jdyu/labs/xerces/ReadXML/ReadXML_ 
    not a dynamic executable 
make: [test_] Error 1 (ignored) 
/users/jdyu/labs/xerces/ReadXML/ReadXML_ /users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml 
Parsing XML file '/users/jdyu/labs/xerces/xerces-c-3.1.1/samples/data/personal.xml' ... 
Parsing finished in 1 millisecond(s). 
37 nodes found. 
XML platform terminated successfully! 

을 얻었다. 나는 열심히 읽어 libtool 코드를 시도했는데, 임시 동적 인 코드 .libs/ReadXML_을 완전히 정적 링크 된 ReadXML_으로 덮는 방법을 찾지 못했습니다. 어쨌든이 질문에 대한 대답이 나와 있습니다.

감사합니다. @ n.m.