我想在我的項目中使用Xerces,在cmake和clang的幫助下編譯我的項目。在ubuntu 12.04上設置Xerces與cmake和clang一起使用
我所做的是:
- 下載源
- 它解壓到一個名爲 '的Xerces-C-3.1.1'
- cd進入這個文件夾
./configure
make
文件夾make install
然後我將LINK_DIRECTORIES(/usr/local/lib)
寫入我的CMakeLists.txt,並將#include <xercesc/parsers/XercesDOMParser.hpp>
寫入我的main.cpp。
它編譯得很好,但鏈接不起作用。 我得到如下結果:
Linking CXX executable DG5_RE
CMakeFiles/DG5_RE.dir/main.cpp.o: In function `xercesc_3_1::XMLAttDefList::~XMLAttDefList()':
/home/reissmann/Dokumente/DGFromRepo/Source_Cpp_RE/main.cpp:(.text._ZN11xercesc_3_113XMLAttDefListD0Ev[_ZN11xercesc_3_113XMLAttDefListD0Ev]+0x1e): undefined reference to `xercesc_3_1::XMemory::operator delete(void*)'
CMakeFiles/DG5_RE.dir/main.cpp.o: In function `xercesc_3_1::DTDEntityDecl::~DTDEntityDecl()':
/home/reissmann/Dokumente/DGFromRepo/Source_Cpp_RE/main.cpp:(.text._ZN11xercesc_3_113DTDEntityDeclD0Ev[_ZN11xercesc_3_113DTDEntityDeclD0Ev]+0x1e): undefined reference to `xercesc_3_1::XMemory::operator delete(void*)'
CMakeFiles/DG5_RE.dir/main.cpp.o: In function `xercesc_3_1::DTDEntityDecl::~DTDEntityDecl()':
/home/reissmann/Dokumente/DGFromRepo/Source_Cpp_RE/main.cpp:(.text._ZN11xercesc_3_113DTDEntityDeclD2Ev[_ZN11xercesc_3_113DTDEntityDeclD2Ev]+0x11): undefined reference to `xercesc_3_1::XMLEntityDecl::~XMLEntityDecl()'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113XMLAttDefListE[_ZTVN11xercesc_3_113XMLAttDefListE]+0x20): undefined reference to `xercesc_3_1::XMLAttDefList::isSerializable() const'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113XMLAttDefListE[_ZTVN11xercesc_3_113XMLAttDefListE]+0x28): undefined reference to `xercesc_3_1::XMLAttDefList::serialize(xercesc_3_1::XSerializeEngine&)'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113XMLAttDefListE[_ZTVN11xercesc_3_113XMLAttDefListE]+0x30): undefined reference to `xercesc_3_1::XMLAttDefList::getProtoType() const'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113DTDEntityDeclE[_ZTVN11xercesc_3_113DTDEntityDeclE]+0x20): undefined reference to `xercesc_3_1::DTDEntityDecl::isSerializable() const'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113DTDEntityDeclE[_ZTVN11xercesc_3_113DTDEntityDeclE]+0x28): undefined reference to `xercesc_3_1::DTDEntityDecl::serialize(xercesc_3_1::XSerializeEngine&)'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTVN11xercesc_3_113DTDEntityDeclE[_ZTVN11xercesc_3_113DTDEntityDeclE]+0x30): undefined reference to `xercesc_3_1::DTDEntityDecl::getProtoType() const'
CMakeFiles/DG5_RE.dir/main.cpp.o:(.rodata._ZTIN11xercesc_3_113DTDEntityDeclE[_ZTIN11xercesc_3_113DTDEntityDeclE]+0x10): undefined reference to `typeinfo for xercesc_3_1::XMLEntityDecl'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [DG5_RE] Fehler 1
make[1]: *** [CMakeFiles/DG5_RE.dir/all] Fehler 2
make: *** [all] Fehler 2
出了什麼問題,什麼是合適的解決方案? 非常感謝提前。
謝謝你這個詳細的答案。但不幸的是,我沒有得到它的工作。我在CMakeLists中添加了這些行。TXT:'find_library(PATH_TO_XERCES libxerces-C的/ usr/local/lib目錄/) IF(NOT PATH_TO_XERCES) 消息(是fatal_error 「無法找到了Xerces庫」)。 ENDIF() target_link_libraries(DG5_RE $ {PATH_TO_XERCES}) '並且出現錯誤「找不到Xerces庫」。但是我在shell中找到了:'locate xerces',輸出是:'/usr/local/lib/libxerces-c-3.1.so /usr/local/lib/libxerces-ca /usr/local/lib/libxerces -c.la /usr/local/lib/libxerces-c.so '所以它應該工作... –
我認爲CMake會在Unix上自動預先設置「lib」作爲名稱。你可以嘗試將名稱設置爲「xerces-c」嗎? – Fraser
謝謝!就是這樣。我會盡量記住,CMake預先「lib」...再次感謝!編輯:你可以編輯你的答案,它包括CMake prepends「lib」,所以我可以將其標記爲答案? –