2011-04-20 86 views
3

各種操作系統鏈接有什麼不同?Linux與Windows鏈接器的區別

例如下面的代碼產生Windows上的連接錯誤(編譯都與VS2010和gcc),但在Linux(Ubuntu中,GCC)編譯成功:

extern int foo 

int main() { 
    foo=1; 
} 

gcc的命令:

gcc -shared filename.cpp 
+0

您是否也將Windows上的代碼編譯爲共享庫? – 2011-04-20 09:14:12

+0

是的,與'exe'的'dll'insted相比較; gcc的命令是一樣的 – krisy 2011-04-20 09:24:37

+0

我對gcc幾乎一無所知,但它真的在那個階段連接? -shared的文檔說它生成一個對象,然後可以在稍後階段與其他對象鏈接;例如你沒有鏈接最終的可執行文件。這似乎更類似於在Windows上構建靜態庫,在這種情況下,它不會給你任何編譯器或鏈接器錯誤。 – Luke 2011-04-20 11:12:45

回答

1

如果你試圖編譯它,你需要像Windows共享庫(維基百科竊取代碼!): -

#include <windows.h> 


// DLL entry function (called on load, unload, ...) 
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) 
{ 
    return TRUE; 
} 

// Exported function - adds two numbers 
extern "C" __declspec(dllexport) double AddNumbers(double a, double b) 
{ 
    return a + b; 
} 

Windows共享模塊(DLL)需要一個DllMain入口點(在第一次加載模塊時執行),並且函數名稱需要通過declspec gobledygook導出,然後才能被另一個程序使用。

+4

我必須不同意wikipedia :-)我不認爲DLLMain是編譯/鏈接所必需的;如果我擦除關鍵字'extern',則其餘代碼將與'DllMain'函數成功編譯和鏈接。要使用dll,我必須具有'extern「C」__declspec(dllexport)',但是在鏈接之後:-) – krisy 2011-04-20 09:29:18

+0

您可能是對的!上次我編寫了一個DLL多年前我需要做一些初始化,所以我總是編寫了DllMain,並假設你必須。 – 2011-04-20 09:35:08

+0

運行時經常提供DllMain – 2011-04-20 21:51:33