我的任务是将2个c文件编译成一个可执行程序。该程序的目的是当从终端内调用后跟 2 个数字时,输出应显示这 2 个数字的总和。
我使用这个命令来编译这两个文件。
sudo gcc main.c | gcc -c my_add.c -o mainprog
但是,当使用此命令从终端调用“./mainprog 2 5”时,我收到一条错误消息,指出“权限被拒绝”
任何见解都值得赞赏。
这是第一个c文件“main.c”
#include "my_add.c"
#include "my_add.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
a = atoi(argv[1]);
b = atoi(argv[2]);
add(a, b);
return 0;
}
这是第二个c文件“my_add.c”
#include "my_add.h"
#include <stdio.h>
#include <stdlib.h>
extern int add(inte a,int b) {
sum = a+b;
printf(" The sum of %d and &d is; %d\n" , a,b,sum);
}
这是我的头文件“my_add.h”
#ifndef __MY_ADD_H__
#define __MY_ADD_H__
int add(int x, int y);
int x;
int y;
int sum;
#endif
答案1
这看起来像一个相当基本的 C 编程练习。
它的目的可能是教你如何首先编译将两个或多个源代码文件 ( *.c
) 放入目标文件( *.o
) 分别,然后关联它们一起形成一个可执行程序。
对于较大的编程项目,这对于在进行很小的更改后最大限度地减少编译时间非常重要:只需重新编译一个目标文件,其余的文件可以按先前编译尝试的原样使用。
使用#include "my_add.c"
破坏了这一想法,因为它迫使编译器将一个文件中的所有代码包含.c
到另一个文件中。你不应该#include
有任何.c
文件,除非您正在执行程序生成的代码或类似的高级操作。即便如此,这也是一种糟糕的风格。
管道的第一部分gcc main.c | ...
将尝试编译main.c
并生成一个a.out
文件(如果没有错误)main.c
)。只有编译器消息将通过管道传输到管道的第二部分,这对它们没有用处。
第二部分... | gcc -c my_add.c -o mainprog
将生成一个名为 的文件mainprog
,但它仅包含my_add.c
.它将忽略前一部分的管道输出。因此,它mainprog
实际上不是一个有效的可执行程序,因为它不包含main()
程序执行应开始的函数。
您可以使用命令来确认这一点file mainprog
,该命令应该输出类似这样的内容(确切的输出可能会根据您的系统架构和操作系统版本而有所不同):
mainprog: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
如果您将其与使用eg 得到的输出进行比较file /bin/ls
,您会注意到输出file /bin/ls
将包含重要的单词executable
,而file mainprog
不会显示该单词。
file
只有该命令列出的程序executable
才是真正完整的程序:gcc -c my_add.c -o mainprog
实际上会生成一个my_add.o
文件,但该-o mainprog
选项将强制将其重命名为mainprog
.
预期的解决方案应该具有:
gcc -c <filename>.c
每个文件一个命令.c
,生成一个相应的<filename>.o
文件。- 以及一个将文件链接到一个完整的可执行文件的
gcc -o mainprog <filename1>.o <filename2>.o
命令。.o
答案2
sudo gcc main.c | gcc -c my_add.c -o mainprog
- 停止使用
sudo
. - 停止管道。
-c
首次调用时使用正确的选项。- 单独进行链接阶段。
可能的正确步骤(从我可以从问题中得出的内容)
gcc -c main.c
gcc -c my_add.c
gcc main.o my_add.o -o prog
源代码中还有其他错误。当您看到工作编译中的错误消息时,这些应该会显现出来。