2011-12-23 102 views
11

我有用C++編寫的共享庫。它導出一個由extern "C"功能創建,銷燬和操縱不透明類型的可見界面。從C調用C++共享庫C

現在,我想有一個純粹的C程序使用這個庫。

我可以做這個(平臺獨立)嗎?如果main未用C++編寫,C++運行時和C++靜態對象何時會初始化?

回答

5

初始化階段是平臺相關的。 在Linux的情況下,動態加載的庫可以包含專門聲明的符號,在加載庫時將自動調用dlopen()

有關更多信息,請參閱dlopen(3)的手冊頁,第部分已過時的符號init()和fini()

靜態初始化程序被隱式標記爲__attribute__((constructor)),所以一般來說,當共享庫被加載時,不必做任何特殊的事情來讓它們調用。我懷疑這在其他平臺上是相同或相似的。

+0

附錄。 (glibc :) init/fini由運行時環境(crtS.o)提供,用於初始化靜態持續時間對象並調用標記爲__attribute __((構造函數))的函數,因此自行重寫init/fini可能會導致問題包括由於雙重符號定義而進行救援。 – 2011-12-23 15:09:02

+0

@jørgensen:這可能是他們被棄用的原因嗎? – onitake 2011-12-23 15:27:19

4

我可以做這個(平臺獨立)嗎?

庫加載是一個平臺相關的操作。

如果main不是用C++編寫的話,C++運行時和C++靜態對象什麼時候會初始化爲 ?

無所謂。它們將在主輸入前被初始化。

+1

那麼,'main'輸入後仍然可以(手動)加載庫。而且「他們將在進入主體之前初始化。」是一種誤解。它是實現定義的,不管初始化靜態對象是在輸入「main」之前發生,還是在第一次使用之前的任何時候。但是,對於所有實際用途,是的,它們在'main'之前被初始化,或者在庫被加載之後被初始化。 – jweyrich 2011-12-28 04:56:06

1

通常,共享庫系統有一個自己的入口點來完成這項工作,而不是main,但DLL有一個DLLMain,其中實現可以放這樣的代碼。然而,在一般情況下,這不關你的事,它是你用來處理這個問題的任何編譯器的工作。