Forskel mellem Linux og Windows linker

Indlæg af Hanne Mølgaard Plasc

Problem



Hvad er forskellen i at forbinde forskellige operativsystemer?


For eksempel producerer følgende kode en linkerfejl på Windows (kompileret både med Vs2010 og gcc), men kompilerer med succes på Linux (Ubuntu, gcc):


extern int foo

int main() {
    foo=1;
}


Gcc kommando:


gcc -shared filename.cpp

Bedste reference


Hvis du forsøger at kompilere det som et Windows-delt bibliotek, har du brug for noget som (kode stjålet fra Wikipedia!): -


#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-delte moduler (DLL'er) kræver en DllMain-adgangspunkt (udført første gang modulet er indlæst) og funktionsnavne skal eksporteres via declspec gobledygook, før de kan bruges af et andet program.