2017-02-16 86 views
0

我想編譯使用另一個共享庫(B)的共享庫(A)。編譯共享庫(舊標準)與C++ 11共享庫

A庫不必爲g ++添加-std=c++11選項而編譯(因爲有大量的代碼,並且有些東西如std::make_pair不能用'11標準)。

對於使用B庫,第一個僅在其文件之一#include "B.h",然後與-I/path/inc -L/path/lib -lB編譯。

庫B由namespace B中的一組函數構成,並在其自己的名稱空間(B :: internals)中包含一些類定義。函數和類之間的關係是全局範圍內的靜態指針,用__attribute__((constructor))進行初始化。

的問題是,這種類(B ::內部:: CLASSB)定義了一些std::mutex私有屬性,並且,所述包含的鏈以下: LIBA - > libB - >B::internals - >std::mutex, 使得在編譯時利巴沒有-std=c++11標準編譯失敗。

但是,libA從來沒有使用B::internals,所以它不應該是混合這兩個庫的問題。另外,如果C++ 11功能是私有屬性,爲什麼它們不會隱藏到libA中?是否有一些圖案用於隱藏B::internals以libA?

回答

1

有一個C++習慣用於隱藏實現細節Pimpl

此外,使用不同C++選項編譯的庫不得在其接口中公開任何std容器,因爲它們的佈局在不同的C++版本中是不同的。

+0

那麼,有兩個頭,一個用於鏈接libA,另一個用於編譯libB呢?是否有一些像#ifdef這樣的技巧,或者是piplm在行業中事實上的標準? – marolafm

+0

@marolafm你應該如何公開API(C風格的函數,接口+工廠函數,Pimpl),但是實現細節不應該出現在頭文件中。 –