在linux终端gcc中编程编译c代码
我正在Linux上编写一个c程序,将文本写入文件。我在尝试使用在linux终端gcc中编程编译c代码,c,linux,gcc,compilation,terminal,C,Linux,Gcc,Compilation,Terminal,我正在Linux上编写一个c程序,将文本写入文件。我在尝试使用system(“gcc fileName.c”)将我创建的新文档编译成可执行文件时遇到了问题。该文件正在获取以下输入: char Msg[100] = {"#include <stdio.h>\nint main();\n\nint main()\n{\n\n\treturn 0;\n}"}; 如果我手动编译它,它工作得很好 我对c非常陌生,所以我不确定我错在哪里,任何帮助都将不胜感激 编辑: 文件内容: #includ
system(“gcc fileName.c”)
将我创建的新文档编译成可执行文件时遇到了问题。该文件正在获取以下输入:
char Msg[100] = {"#include <stdio.h>\nint main();\n\nint main()\n{\n\n\treturn 0;\n}"};
如果我手动编译它,它工作得很好
我对c非常陌生,所以我不确定我错在哪里,任何帮助都将不胜感激
编辑:
文件内容:
#include <stdio.h>
int main();
int main()
{
return 0;
}
请不要太苛刻地评判,我只是在学c
编辑:
更新:
我决定在我的Win8电脑上试用这段代码,我意识到我的问题中至少有一个是一些垃圾,但现在我稍微编辑了一下。在Windows上,我有MinGW,当我尝试将o文件编译为可执行文件时,它会写入不同的消息:
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c:(.tex
t.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
我没有完全遵循你的逻辑,这里有一些可能的问题: 首先,你从哪里获得路径;这个程序使用命令行参数可能比使用命令行参数更简单 这意味着您在主文件中声明main,如下所示: int main(int argc,char*argv[]) 在这种形式中,argc是传递的参数数,包括文件名,argv[0]是保存文件名的字符串 因此,与其依赖程序为您生成文件,不如这样做:
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main( int argc, char *argv[] ) {
if (argc != 3) {
fprintf( stderr, "Usage: %s %s\n", argv[0], "input_file output_file" );
fprintf( stderr, "Do not add an extension to output_file.\n" );
return EXIT_FAILURE;
}
unsigned int i = 0;
for (i = 0; i < strlen( argv[2] ); i++) {
if (argv[2][i] == '\n' || argv[2][i] == '\0') {
argv[2][i] = '\0';
break;
}
}
char format_string[150];
sprintf( format_string, "gcc.exe -Wall -Wextra -c %s -o %s.o", argv[1], argv[2] );
char format_string2[150];
sprintf( format_string2, "gcc.exe %s -o %s.exe", argv[1], argv[2] );
system( format_string );
system( format_string2 );
return EXIT_SUCCESS;
}
#包括“stdlib.h”
#包括“stdio.h”
#包括“string.h”
int main(int argc,char*argv[]){
如果(argc!=3){
fprintf(标准,“用法:%s%s\n”,argv[0],“输入文件输出文件”);
fprintf(stderr,“不要向输出_文件添加扩展名。\n”);
返回退出失败;
}
无符号整数i=0;
对于(i=0;i
使用上述程序,您只需创建输入文件,然后将inpu文件作为第一个参数传递,并将输出传递给第二个参数。这个文件有两个假设:输入文件存在,gcc的路径在环境的path变量中
最后,别忘了main不需要原型。与您的问题无关,但为什么代码在指针数组中?如果你把它放在一个数组中,比如
charmsg[]=“…”,会不会更容易些代码>?关于您的问题,您是否检查了输出文件?你试过手动编译吗?谢谢,我对所有数组都有点困惑,我已经解决了,但问题还是一样的。是的,我在很多方面手动尝试过,如果我使用-c,它会创建一个对象文件,但我仍然无法将其编译为可执行文件。可能是由system
生成的shell使用的路径与普通shell中的路径不同,因此,system
调用的gcc
命令与手动执行它调用的命令不同。这是我的猜测,但我如何才能找出它的不同之处?如果我使用printf()
或echo
将其写出来,它看起来与我写的内容完全相同,即使我将其复制出来并手动使用
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c:(.tex
t.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main( int argc, char *argv[] ) {
if (argc != 3) {
fprintf( stderr, "Usage: %s %s\n", argv[0], "input_file output_file" );
fprintf( stderr, "Do not add an extension to output_file.\n" );
return EXIT_FAILURE;
}
unsigned int i = 0;
for (i = 0; i < strlen( argv[2] ); i++) {
if (argv[2][i] == '\n' || argv[2][i] == '\0') {
argv[2][i] = '\0';
break;
}
}
char format_string[150];
sprintf( format_string, "gcc.exe -Wall -Wextra -c %s -o %s.o", argv[1], argv[2] );
char format_string2[150];
sprintf( format_string2, "gcc.exe %s -o %s.exe", argv[1], argv[2] );
system( format_string );
system( format_string2 );
return EXIT_SUCCESS;
}