C++ g++;是否自动导入libkernel32.a和libuser32.a?

C++ g++;是否自动导入libkernel32.a和libuser32.a?,c++,winapi,dll,g++,C++,Winapi,Dll,G++,我只是想知道一些关于在g++下编译windows程序的事情。 假设我有一个(非常)简单的程序: int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* szCmdLine, int iCmdShow) { registerWindowClass(hInstance); HWND hwnd = createWindow(hInstance); MSG msg

我只是想知道一些关于在g++下编译windows程序的事情。 假设我有一个(非常)简单的程序:

int __stdcall WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    char* szCmdLine,
    int iCmdShow)
{
    registerWindowClass(hInstance);
    HWND hwnd = createWindow(hInstance);

    MSG msg;
    bool iRet;
    while((iRet = GetMessage(&msg, NULL, 0, 0)) != 0){
        if(iRet == -1)
            return EXIT_FAILURE;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;

}
功能在哪里

registerWindowClass
createWindow
照他们的名字做。已注册窗口类的窗口过程仅用于通过调用PostQuitMessage(0)处理WM_DESTROY消息

我将此编译为

g++ -o test.exe test.cpp -lgdi32
这里我需要链接导入库libgdi32.a,否则我会得到一个未定义的对函数GetStockObject的引用,我使用它进行设置 窗口类的背景笔刷句柄

现在,据我所知,windows程序的许多基本功能都包含在库kernel32.dll、user32.dll中。例如,user32.dll包含处理用户输入的函数。因此,我假设这些库确实在我的简单程序中使用?但是,请注意,我不必针对它们的导入库显式链接。我没有这样编译:

g++ -o test.exe test.cpp -lgdi32 -lkernel32 -luser32
为什么不要求我链接libkernel32.a和libuser32.a,但要求我链接libgdi32.a

如果我们创建一个VisualStudio项目并转到 项目属性->链接器->输入 看看其他依赖项,我们可以清楚地看到kernel32.lib;user32.lib;gdi32.lib;comdlg32等

我自己对答案的“猜测”如下(这可能是完全错误的): 我的代码显式调用gdi32.dll中的函数,但它不显式调用kernel32.dll或user32.dll中的任何函数。取而代之的是,Windows本身在“引擎盖下”执行对kernel32.dll和user32.dll的一系列调用。由于我在程序中不使用kernel32.dll或user32.dll中的任何函数,因此我也不必链接它们。 我可能完全错了


谢谢你的意见。

嗯,你的假设有点错误。与某事物相联系实际上并不意味着需要它。VisualStudio设置了默认库,只是为了保护您不必自己解决链接器问题,并在MSDN上查找哪个库包含哪个函数。让我们来看一个简单的例子:

#include <iostream>

int main(int argc, char** argv)
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
#包括
int main(int argc,字符**argv)
{

Std::CUT

嗯,你的假设有点错误。链接某些东西实际上并不意味着它是需要的。VisualStudio有默认的库集,只是为了保护你不必自己解决链接器的问题,并且查找哪个库包含MSDN上的函数。

#include <iostream>

int main(int argc, char** argv)
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
#包括
int main(int argc,字符**argv)
{

Std::CUT

嗯,你的假设有点错误。链接某些东西实际上并不意味着它是需要的。VisualStudio有默认的库集,只是为了保护你不必自己解决链接器的问题,并且查找哪个库包含MSDN上的函数。

#include <iostream>

int main(int argc, char** argv)
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
#包括
int main(int argc,字符**argv)
{

Std::CUT

嗯,你的假设有点错误。链接某些东西实际上并不意味着它是需要的。VisualStudio有默认的库集,只是为了保护你不必自己解决链接器的问题,并且查找哪个库包含MSDN上的函数。

#include <iostream>

int main(int argc, char** argv)
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
#包括
int main(int argc,字符**argv)
{

std::你猜错了吗?例如,是user32.dll导出。你显式地调用它。好的,谢谢,这排除了我的猜测:)你猜错了。例如,是user32.dll导出。你显式地调用它。好的,谢谢,这排除了我的猜测:)你猜错了,例如,是user32.dll导出。你明确地调用了它。好的,谢谢,这排除了我的猜测:)你猜错了。例如,是user32.dll导出。你明确地调用了它。好的,谢谢,这排除了我的猜测:)好的,那么我说的对吗:g++-o test.exe test.cpp是“等效的”到g++-o test.exe test.cpp-lkernel32-luser32,因为libkernel32.a和libuser32.a总是链接的?一般来说,是的。gcc/g++使用的默认库取决于它的构建/配置方式。您可以做的是将
-v
添加到构建行中,如
gcc-v
,这样将转储gcc使用的完整命令因此,您将能够看到默认情况下存在的内容。谢谢,这是一个很好的提示。我尝试使用标志“-v”进行编译,并且在我可以看到的变量COLLECT_GCC_选项中-luser32-lkernel32。好的,那么当我说:g++-o test.exe test.cpp是“等效”时,我是否正确理解了您的意思到g++-o test.exe test.cpp-lkernel32-luser32,因为libkernel32.a和libuser32.a总是链接的?一般来说,是的。gcc/g++使用的默认库取决于它的构建/配置方式。您可以做的是将
-v
添加到构建行中,如
gcc-v
,这样将转储gcc使用的完整命令因此,您将能够看到默认情况下存在的内容。谢谢,这是一个很好的提示。我尝试使用标志“-v”进行编译,并且在我可以看到的变量COLLECT_GCC_选项中-luser32-lkernel32。好的,那么当我说:g++-o test.exe test.cpp是“等效”时,我是否正确理解了您的意思到g++-o test.exe test.cpp-lkernel32-luser32,因为libkernel32.a和libuser32.a总是链接的?一般来说,是的。gcc/g++使用的默认库取决于它的构建/配置方式。您可以做的是将
-v
添加到构建行中,如
gcc-v
,这样将转储gcc使用的完整命令因此,您将能够看到默认情况下存在的内容。谢谢,这是一个很好的提示。我尝试使用标志“-v”进行编译,并在我可以看到的变量COLLECT_GCC_选项中(以及许多其他选项)-luser32-lkernel32。好的,我明白了吗