2017-03-15 64 views
0

我正在嘗試爲一個相當大的項目編譯一個.so文件,並且遇到了這樣的問題,即任何文件中寫入的任何類,模板或其他文件都不在完成的.so文件中。如何確保模板類定義使其進入共享庫?

我所做的文件:

g++ -shared -fPIC -Wall filename1.cpp -o libfilename1.so 

我就不告訴你了納米全力輸出,但所有的中定義的非模板函數有,沒有的模板功能,模板化課程或課程都在那裏。我在類聲明中嘗試使用__attribute__ ((visibility=("default"))),但它似乎沒有做任何事情。

+0

可能是因爲模板是*模板*而不是具體的類。以例如'std :: vector',它是一個模板。 'std :: vector '是一個具體的類。 –

+0

模板必須實例化才能編譯。結論是你的共享庫中不能有模板。 – DeiDei

+0

您的.so是否實例化了一些導出的模板函數? – em2er

回答

0

模板是編譯期間僅存在於編譯器中的東西。編譯器使用該模板來創建所述模板的實例化。那些是「真正的」類或功能。它們對連接器可見,因此可以放入共享庫中。

爲了達到這個目的,你需要通知編譯器,該編譯器正在編譯與該庫鏈接的代碼,該庫中存在某個模板的特定實例。

extern template​ Class<int>; // since C++11 

其次,你需要告知其編譯爲表示實例應當存在,使用一個明確的模板定義(在源庫中的代碼編譯器:這是通過聲明一個顯式實例(在頭)來完成庫的代碼):

template Class<int>;