我有一個C++項目,由於其目錄結構設置爲一個靜態庫A
,它鏈接到共享庫B
,鏈接到可執行文件C
。 (這是使用CMake的一個跨平臺的項目,所以在Windows上,我們得到A.lib
,B.dll
和C.exe
,並在Linux上,我們得到libA.a
,libB.so
和C
)圖書館A
有一個初始化函數(A_init
,在A/initA.cpp
定義)從庫B
的初始化函數(B_init
,在B/initB.cpp
中定義)中調用該函數,該函數從C
的主函數中調用。因此,鏈接B
,A_init
(和initA.cpp
中定義的所有符號)鏈接到B
(這是我們所需的行爲)。如何在鏈接到可執行文件時強制在靜態庫中包含對象文件?
,問題就在於該A
庫還定義了旨在由動態加載的函數(Af
,在A/Afort.f
定義)(在Windows即LoadLibrary
/GetProcAddress
和Linux上dlopen
/dlsym
)。由於沒有提及來自庫B
的Af
,所以來自A/Afort.o
的符號不包括在B
中。在Windows中,我們可以人爲地通過編譯創建一個參考:
#pragma comment (linker, "/export:_Af")
因爲這是一個編譯,它只能在Windows上(使用Visual Studio 2008)。得到它的工作在Linux上,我們嘗試加入以下A/initA.cpp
:
extern void Af(void);
static void (*Af_fp)(void) = &Af;
這不會導致符號Af
被列入B
的最後一個環節。我們如何強制將符號Af
鏈接到B
?
C實際上是一種腳本語言前端,B是語言引擎,A是引擎使用的一組本機代碼方法。我們正在實現一個預先存在的語言,該語言具有定義良好的外部函數接口。 A和B由分開的小組生產;我們希望保留A-team在A目錄中寫入的所有內容。 – 2010-06-07 20:02:09