gcc (GCC) 4.7.2
我創建一個共享庫,將編譯在Linux上,這將彙編使用相同的源代碼窗口的DLL。所以我正在爲Linux和Windows創建一個可移植的庫。
在該庫我的頭文件是這樣的module.h中即
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
#else
#define LIB_INTERFACE(type) type
#endif
LIB_INTERFACE(int) module_init();
#ifdef __cplusplus
}
#endif
在源我有以下即的module.c
#include "module.h"
LIB_INTERFACE(int) module_init()
{
/* do something useful
return 0;
}
而且在我的測試應用程序,將鏈接並使用此module.so我有這個:
#include "module.h"
int main(void)
{
if(module_init() != 0) {
return -1;
}
return 0;
}
1)是我在上面做的是它是一個正確的工程爲Linux和Windows創建便攜式庫的ntation?
2)我只是想知道我已經包裝了extern "C"
中的函數,以便可以從已經用C++編譯的程序調用該庫。我還需要這EXTERN_C
在以下幾點:
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
3)什麼是EXTERN_C
的目的是什麼?
提前許多感謝,
它是一個宏,它解析爲用於C++編譯的'extern「C」',用於C編譯的'extern'或者什麼也不是。 (我真的不記得哪一個,但突出顯示它並按F12,它應該帶你到實際的定義)。它的目的是指示編譯器從正在從庫中導出的符號中刪除C++名稱。不,如果你已經把整個頭部封裝在'extern「C」{'你可以消除它(假設gcc理解同一個block-extern-C,再次,我不誠實地記得它是否會)。 – WhozCraig
請閱讀[this](http://gcc.gnu.org/wiki/Visibility)。你可能想要使用這種機制。 –
@ ant2009您的庫必須從C使用,還是可以將其限制爲C++ 11? –