私の使命は、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.c
a.out
main.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
答え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
ソースコードに異なるエラーがあります。作業中のコンパイルでエラーメッセージが表示されると、これらのメッセージが表示されます。