C++ GCC与Windows SDK?

C++ GCC与Windows SDK?,c++,visual-studio,gcc,C++,Visual Studio,Gcc,关于如何使用GCC构建本机Windows应用程序,我得到了很多相互矛盾的信息 基本上,我想从熟悉的角度学习Windows编程。我想了解哪些库需要包含在哪些头文件中,等等,这样我就可以对底层实现有一些了解。我觉得VisualStudio在构建过程中有时似乎是不透明的,但在这一过程中,VisualStudio带走了很多东西(当我包含标题时,库会自动链接,这让我很难看到正在做什么) 编辑:感谢Ben和Serge指出了最后一句话的虚假性。VS不会根据包含的头自动包含库,而是链接许多默认库,而不管包含的头

关于如何使用GCC构建本机Windows应用程序,我得到了很多相互矛盾的信息

基本上,我想从熟悉的角度学习Windows编程。我想了解哪些库需要包含在哪些头文件中,等等,这样我就可以对底层实现有一些了解。我觉得VisualStudio在构建过程中有时似乎是不透明的,但在这一过程中,VisualStudio带走了很多东西(当我包含标题时,库会自动链接,这让我很难看到正在做什么)

编辑:感谢Ben和Serge指出了最后一句话的虚假性。VS不会根据包含的头自动包含库,而是链接许多默认库,而不管包含的头是什么,但是只有翻译单元所需的函数/类等才会最终包含在最终可执行文件中

有没有一种方法可以为Windows开发,使用Windows API(即不是libc),但使用“用户友好”程度较低的环境

我更愿意坚持GCC(MinGW等),但我对其他工具链持开放态度。我只想了解一下VisualStudio的膨胀和抽象

我可以下载windows SDK并开始使用MinGW构建吗?如果没有,我在哪里可以获得本机开发所需的标题和库?它会使用minGW之类的工具正确编译吗

有很多问题

谢谢

小结:请看Serge非常有用的答案


谢谢大家提供的信息

如果您想进行命令行构建,没有什么可以阻止您编写自己的文件,该文件描述了使用什么标志编译哪些文件以及它们如何链接到自己的可执行文件中

windows编译器正在运行

windows链接器是Visual Studio(或其免费变体Visual Studio Express),不自动查找与标头关联的库。默认情况下,它使用一组标准库。但我可以告诉您,一旦您使用更少的标准API,您就必须同时声明头和库。如果您深入查看项目属性,就会发现编译和链接阶段的确切命令行

您可以使用MSVC工具或MingW工具,但决不要尝试混合使用它们!对象格式彼此不兼容

编辑:

现在,我将描述它在我知道的版本(MSVC Express 2008)中是如何工作的。项目的配置在
项目/属性
下提供。您通常可以在此处找到2个配置(
Debug
Release
),但始终可以通过
configuration Manager
添加新的特殊构建配置。您可以选择要查看的配置(或选择
All configurations
)以在任何地方应用更改

configurationproperties
下,您可以找到
C/C++
(编译阶段)和
Linker
(链接阶段)的项目,其中包含可以调整几乎所有内容的菜单。最后一个菜单始终是
命令行
,并给出将使用的实际命令行

如果您使用另一个版本,您的里程数可能会有所不同,但我始终能够在较旧的MSVC版本的
Project/Properties
下找到配置

编辑2:


关于默认库的列表,它们由链接器独立于您可能在不同源中使用或不使用的头来使用。但是,由于它们是库而不是对象模块,所以只有对象模块(包含在库中)程序直接或间接需要的文件将在可执行文件中结束。我几乎从未使用过“忽略默认库”选项。主要是当我想确定我没有使用系统库来减少非常特殊的用例的可执行文件的大小时。

MinGW已经包含Windows SDK h的修改版本eaders,所以您应该能够从开箱即用开始。您尝试过什么?您说“当我包含标题时,库会自动链接,这让我很沮丧”。这些标题是什么?在我使用Visual Studio的所有岁月中,它从未以这种方式“帮助”过我。例如,如果我包含标题(例如windows.h),构建过程只需一个按钮即可完成。我想自己按名称链接库,这样我才能真正了解实现。很抱歉,如果我弄错了一些细节,我没有太多使用VS。关于SDK,据网站称,它不再附带任何构建工具。否则,那就完全不是了他是我在寻找的东西。如果MinGW附带SDK头,我还需要下载一些库吗?谢谢Serge。默认情况下,所有这些标准库都链接进来了,或者是否有一个过程,根据项目(可能通过扫描头)只链接所需的库确切的命令行正是我正在寻找的,我如何在VisualStudio环境中找到?@ ReZoukkE:再次编辑感谢。非常有用。我可以看到C++编译器和链接器命令都是通过这个方法使用的。我可以确认它在VS社区2013上是相同的。链接器默认地给出这些库:“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib”“comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“oleaut32.lib”“uuid.lib”“odbc32.lib”“odbccp32.lib”“。无论标题是否引用,这些都是链接在一起的吗?感谢您花时间对我所有的Q给出如此全面的答案,并解决我所有的微概念。