Linux和Windows链接器的区别

3

各种操作系统之间的链接有什么区别?

例如,以下代码在Windows上(使用Vs2010和gcc编译)会产生链接器错误,但在Linux上(Ubuntu,gcc)可以成功编译:

extern int foo

int main() {
    foo=1;
}

Gcc命令:

gcc -shared filename.cpp

你也在Windows上将代码编译为共享库吗? - user500944
是的,在使用'dll'而不是'exe'时,gcc命令是相同的。 - krisy
我对gcc几乎一无所知,但它真的在那个阶段进行链接吗?-shared的文档说它会生成一个对象,然后可以在以后的阶段与其他对象链接;例如,您没有链接最终可执行文件。这似乎更类似于在Windows上构建静态库,在这种情况下,不会给您任何编译器或链接器错误。 - Luke
链接器错误信息是什么? - Santa
我非常确定你的示例在所有标准兼容的C编译器上都会产生编译错误,因为你在第一行缺少了一个; - greatwolf
1个回答

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
我必须反对维基百科 :-) 我认为编译/链接不需要 DLLMain;如果我删除关键字“extern”,其余代码可以成功编译和链接而无需使用DllMain函数。要使用 dll,我必须有 extern "C" __declspec(dllexport),但那是在链接之后的事情 :-) - krisy
你说得对!我上一次编写DLL是很多年前了,当时我需要进行一些初始化,所以我总是编写DllMain并且认为你必须这样做。 - James Anderson
运行时通常提供DllMain。 - David Heffernan
除非你想强制使用 C 链接,否则不需要使用 extern "C"。在 DLL 中,C++ 签名也可以正常工作。 - Dennis Hostetler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接