MinGW不';编译时不生成对象文件 我刚刚在旅行中买了一台新的笔记本电脑,然后在空闲的时候,我开始尝试编译我自己的用C++编写的操作系统,然后我就创建了所有需要的文件和内核。 extern "C" void _main(struct multiboot_data* mbd, unsigned int magic); void _main( struct multiboot_data* mbd, unsigned int magic ) { char * boot_loader_name =(char*) ((long*)mbd)[16]; /* Print a letter to screen to see everything is working: */ unsigned char *videoram = (unsigned char *) 0xb8000; videoram[0] = 65; /* character 'A' */ videoram[1] = 0x07; /* forground, background color. */ }

MinGW不';编译时不生成对象文件 我刚刚在旅行中买了一台新的笔记本电脑,然后在空闲的时候,我开始尝试编译我自己的用C++编写的操作系统,然后我就创建了所有需要的文件和内核。 extern "C" void _main(struct multiboot_data* mbd, unsigned int magic); void _main( struct multiboot_data* mbd, unsigned int magic ) { char * boot_loader_name =(char*) ((long*)mbd)[16]; /* Print a letter to screen to see everything is working: */ unsigned char *videoram = (unsigned char *) 0xb8000; videoram[0] = 65; /* character 'A' */ videoram[1] = 0x07; /* forground, background color. */ },c++,binary,g++,mingw,C++,Binary,G++,Mingw,并试图用g编译它++ G:>G++-oc:\kernel.o-C kernel.cpp-Wall-Wextra-Werror-nostlib-notartfiles-nodefaultlibs kernel.cpp:在函数“void”main(multiboot\u data*,unsigned int)中: kernel.cpp:8:警告:未使用的变量“boot\u loader\u name” kernel.cpp:在全局范围内: kernel.cpp:4:警告:未使用的参数'magic'

并试图用g编译它++

G:>G++-oc:\kernel.o-C kernel.cpp-Wall-Wextra-Werror-nostlib-notartfiles-nodefaultlibs
kernel.cpp:在函数“void”main(multiboot\u data*,unsigned int)中:
kernel.cpp:8:警告:未使用的变量“boot\u loader\u name”
kernel.cpp:在全局范围内:
kernel.cpp:4:警告:未使用的参数'magic'

G:>

但是它不会在
C://
>上创建任何二进制文件


我能做什么?

您是否先尝试在本地目录中创建
.o
文件?您得到了什么结果?

您是否尝试先在本地目录中创建
.o
文件?您得到了什么结果?

C:\通常被阻止在Vista和7上写入,因为它被认为是一个非常敏感的位置,您必须以管理员身份运行才能这样做(如,显式启动命令提示符或具有管理员权限的g++)。如果您使用的是“普通”(非管理员)用户帐户,即使是在XP中,也应该使用同样的方法


也许这就是发生在你身上的事情?

C:\通常被禁止在Vista和7上写入,因为它被认为是一个非常敏感的位置,你必须以管理员身份运行才能这样做(例如,显式启动命令提示符或具有管理员权限的g++)。如果您使用的是“普通”(非管理员)用户帐户,即使是在XP中,也应该使用同样的方法


也许这就是您的情况?

它不会创建文件,因为您启用了
-Werror
。您收到的关于未使用的变量的警告被视为错误,因此编译被中止。现在只需对它们进行评论:

void _main( struct multiboot_data* mbd, unsigned int /* magic */ )
{
    // char * boot_loader_name =(char*) ((long*)mbd)[16];
    // ...
}

它应该建得很好。另外,难道不应该将
\u main()
声明为
main()
,然后允许编译器将其“篡改”为
\u main()
编辑:您可能还想使用
-c
跳过链接阶段,假设您只需要对象文件。

它不会创建文件,因为您启用了
-Werror
。您收到的关于未使用的变量的警告被视为错误,因此编译被中止。现在只需对它们进行评论:

void _main( struct multiboot_data* mbd, unsigned int /* magic */ )
{
    // char * boot_loader_name =(char*) ((long*)mbd)[16];
    // ...
}

它应该建得很好。另外,难道不应该将
\u main()
声明为
main()
,然后允许编译器将其“篡改”为
\u main()
编辑:您可能还想使用
-c
跳过链接阶段,假设您只想要对象文件。

是的,但我还是什么都没有。@Nathan:这很奇怪。试着把一个空的
main
编译成一个可执行文件,mingw会创建它吗?@Nathan:然后用同样的命令行调用你的.cpp文件不会创建任何东西?根本没有新文件?@Eli:如果我做一个Hello World(使用
cout
#include
…),它编译得很好,但是如果我尝试编译我的简单内核,我不会创建任何东西。@Nathan:可能是因为你的内核没有
main
函数吗?是的,我还是什么都没有。@Nathan:这很奇怪。试着把一个空的
main
编译成一个可执行文件,mingw会创建它吗?@Nathan:然后用同样的命令行调用你的.cpp文件不会创建任何东西?根本没有新文件?@Eli:如果我使用Hello World(使用
cout
#include
),它编译得很好,但是如果我尝试编译我的简单内核,内森:这可能是因为你的内核没有
main
函数吗?我换了
G:
还是什么都没有。我换了
G:
还是什么都没有。为什么不试试一个最简单的例子:1)在某个地方创建一个像
1.cpp
这样的文件,其中只包含
int main(){return 0;}
(以及末尾的空行);2) 在该文件夹中运行
g++-c1.cpp-Wall
;然后看看会发生什么?为什么不试试一个最简单的例子:1)在某处创建一个像
1.cpp
这样的文件,其中只包含
int main(){return 0;}
(最后是空行);2) 在该文件夹中运行
g++-c1.cpp-Wall
;然后看看会发生什么?啊,是的,
extern“C”
会处理这个问题。傻兔子。另外,我已经有一段时间没有看维基了。啊,对了,
extern“C”
会处理这个问题。傻兔子。而且我已经有一段时间没看维基了。