2つのcファイルを1つのプログラムにコンパイルするときに権限が拒否されました。

2つのcファイルを1つのプログラムにコンパイルするときに権限が拒否されました。

私の使命は、2つのcファイルを実行可能プログラムにコンパイルすることです。このプログラムの目的は、端末内で2つの数字が後ろに呼び出されたときに、出力に対応する2つの数字の合計を表示する必要があることです。

このコマンドを使用して両方のファイルをコンパイルします。

sudo gcc main.c | gcc -c my_add.c -o mainprog

ただし、このコマンドを使用して端末で「./mainprog 2 5」を呼び出すと、「Permission Denied」というエラーが発生します。

どんな洞察力でも感謝します。

これは最初の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;
}

これは2番目の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)それぞれ、それから協会これらは一緒に実行可能なプログラムを形成します。

大規模なプログラミングプロジェクトでは、小さな変更を行った後にコンパイル時間を最小限に抑えることが重要です。 1つのオブジェクトファイルのみを再コンパイルするだけで、残りは以前のコンパイル試行でそのまま使用できます。

これを使用すると、#include "my_add.c"コンパイラがあるファイル内のすべてのコードを.c別のファイルに含めることを強制するため、アイデアは無効になります。ファイル#includeがあってはなりません。.c、プログラムで生成されたコードや同様の高度な操作を行わない限り。それでもスタイルがあまりないですね。

パイプラインの最初の部分では、ファイルのコンパイルと生成をgcc main.c | ...試みます(エラーがない場合)。ただmain.ca.outmain.cコンパイラメッセージパイプの2番目の部分に接続されますが、この部分は使用されません。

2番目の部分ではという名前の... | gcc -c my_add.c -o mainprogファイルが生成されmainprogますが、これには.のみが含まれますmy_add.c。前の部分のパイプされた出力は無視されます。したがって、プログラムの実行を開始する必要がある機能がmainprog含まれていないため、実際には有効な実行プログラムではありません。main()

file mainprog次のように出力されるコマンドを使用してこれを確認できます(正確な出力はシステムアーキテクチャとOSバージョンによって異なります)。

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ファイルごとに1つのコマンドで.cその<filename>.oファイルを生成します。
  • そして、ファイルを完全な実行ファイルにリンクするコマンドですgcc -o mainprog <filename1>.o <filename2>.o.o

おすすめ記事