2015-08-08 18 views
0

當試圖與使用Xcode 6.3.2構建的動態庫鏈接時,我所有對參數爲std: :字符串拒絕鏈接:從我的dylib調用具有std :: string params的成員函數會創建「未定義的符號」錯誤

Undefined symbols for architecture x86_64: 
    「MyClass::Bogus(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)」,… 

的dylib的.h文件中被包括在內,大衆類成員的原型爲:

int Bogus(std::string& aStringRef, bool verbose); 

有趣的是,如果我改變第一性病的類型: :將字符串參數設置爲long(並且將其與第一個參數一樣長),則不存在鏈接錯誤。所以我知道我確實與我建立的dylib連接。

對於我的dylib,Apple LLVM 6.1 C++標準庫設置爲默認(libstdC++)。

我在哪裏進行調用從本身是一個名爲.dylib,並正在編制和Xcode中沒有聯繫,而是完全從生成文件的代碼。 C++的使用從makefile編譯的版本是:

看起來可疑我
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 
Target: x86_64-apple-darwin14.4.0 
Thread model: posix 

的一件事是調用代碼使用「-std = C++ 1Y」編譯,可以使用標準用於C++的庫14。爲調用程序鏈接的標準庫與我爲構建dylib選擇的標準庫之間是否存在衝突?(我的dylib代碼正在使用編譯器方言= GNU ++ 98編譯)

+0

它看起來像你的代碼與的libC++編譯。 –

+0

@KerrekSB - 在我的鏈接dylib上運行工具-L顯示:c \t /usr/lib/libstdc++.6.dylib(兼容性版本7.0.0,當前版本104.1.0) – SMGreenfield

+1

是/usr/lib/libstdc++.6。 dylib一個符號鏈接的任何機會? –

回答

1

很難通過不同的二進制模塊之間的標準庫中的對象,因爲他們的二進制表示和實施細則不規範。

爲了使它工作,你需要確保所有的模塊都使用相同的編譯器,標準庫實現和所有相關的編譯設置(例外,迭代器調試等)。 ..這基本上破壞了首先有一個動態庫的目的。當傳遞數據時,您應該堅持使用簡單的指針(c字符串,數據緩衝區),或者引入一些自定義的,更透明的數據類型。

見如下回答一些具體的解決方案:

Passing std::string in a library API

Passing reference to STL vector over dll boundary

+0

嗯,這是一個令人傷心的事情!在我們的例子中,它始終打算從同一個makefile同時構建兩個dylib - 我們只是通過在Xcode中構建被調用的dylib進行測試。我想知道是否使用Boost字符串可能會使該過程對二進制不兼容性更具抵抗性? – SMGreenfield

+0

@SMGreenfield如果您需要特定的std :: string,最簡單的解決方案可能是在您的一個模塊中實現一個最小的std :: string包裝器,並在所有的跨庫接口中使用。 – ing

相關問題