将2个c文件编译成一个程序,权限被拒绝

将2个c文件编译成一个程序,权限被拒绝

我的任务是将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

源代码中还有其他错误。当您看到工作编译中的错误消息时,这些应该会显现出来。

相关内容