2013-05-10 49 views
1

靜態鏈接庫我下載並解壓xerces-c-3.1.1-x86_64-linux-gcc-3.4.tar.gz, 所以,我有不能使用Xerces-C與G ++

$ 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 

然後,我有我的Makefile作爲

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命令工作正常。

$ 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日

其次@牛米。的建議,並得到了錯誤,如

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,我

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

嘗試'-Wl,-Bstatic'而不是'-Bstatic'。同樣使用'-v'來查看g ++傳遞給鏈接器的確切選項。 – 2013-05-10 10:59:26

+1

更確切地說,如果你想讓這個庫靜態鏈接,就說'-Wl,-Bstatic -lxerces-c -Wl,-Bdynamic'。並非所有的系統都支持靜態鏈接到所有的系統庫。 – 2013-05-10 11:07:25

+0

@ n.m。感謝您的回答。將在星期一嘗試。順便說一句,爲什麼不發表一個答案呢? – 2013-05-11 07:46:13

回答

3

感謝@牛米。的幫助。我從libtool研究了一些後得到了答案。讓我在這裏發佈答案。

最後我的工作Makefile看起來像

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 

,然後將結果當屬

$ 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靜態鏈接。


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 

make文件,並得到了結果

$ 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學習我。我努力閱讀libtool的代碼,只是未能弄清楚它是如何將臨時動態.libs/ReadXML_轉化爲最終的ReadXML_這完全是靜態鏈接的。 無論如何,這個問題的答案是找到的。

再次感謝@n.m。