2013-05-29 53 views
1

我使用cygwin創建了一個使用Xerces的共享庫/ DLL。當我從主應用程序調用xercesc函數時,一切正常,但是當我嘗試將一些代碼放入庫中時,則會爲xerxesc定義的所有靜態內容獲取未定義的符號。使用xerces鏈接DLL給出了未定義的符號

例如:

std::string fromXMLString(XMLCh *oXMLString) 
{ 
    std::string result; 
    xercesc::DOMImplementation *impl = xercesc::DOMImplementationRegistry::getDOMImplementation(X("Core")); 

    char *temp = xercesc::XMLString::transcode(oXMLString); 
    result = temp; 

    xercesc::XMLString::release(&temp); 
    return result; 
} 

鏈接:

g++ -shared -Wl,-soname,cygsupport.so -L /usr/local/lib -l xerces-c -o cygsupport.so obj/helper/xml_helper.o 

當鏈接庫,我得到:

/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::DOMImplementationRegistry::getDOMImplementation(wchar_t const*)' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::transcode(wchar_t const*, xercesc_3_1::MemoryManager*)' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(char**, xercesc_3_1::MemoryManager*)' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLString::release(wchar_t**, xercesc_3_1::MemoryManager*)' 
/usr/local/include/xercesc/internal/XSerializable.hpp:37: undefined reference to `xercesc_3_1::XMLPlatformUtils::fgMemoryManager' 

...

+0

您是否正確設置了路徑變量?從xerces網站:「您需要將xerces-c-3.1.1- {arch} - {os} - {compiler}/bin目錄添加到您的PATH環境變量中:」 – ChrisCM

+0

當我編譯主應用程序時,它作品。這只是共享庫,給我帶來麻煩。我的假設是,共享符號應該以某種方式轉發給主應用程序,並且不需要在共享庫中解析。 – Devolus

回答

2

最後經過數天調查這個問題我佛和解決方案。它和愚蠢一樣簡單。

我原來的連接器命令行是這樣的:

g++ -shared -o mylib.so -L/usr/local/lib -lxerces-c objects... 

谷歌搜索在這個問題上沒有取得任何有用的,所以最後我決定創建與日食一個全新的樣本項目,突然它的工作。唯一的區別是在鏈接器的命令行中。當我將同樣的命令應用到我的主項目時,它突然編譯。

g++ -L/usr/local/lib -shared -o mylib.so objects... -lxerces-c 

請注意,在上面的行中,對象出現在庫之前,顯然這有所不同。我認爲庫的排序只適用於庫,但顯然也必須適當地排序對象。

相關問題