1

質問があります。コードを別のコードで再コンパイルできるかどうか疑問に思っていました。例(理論的):

main.c:

#include <stdio.h>

void showme();

int main()
{
   showme();
}

void showme()
{
   fprintf(stderr, "errtest, show me");
}

このファイルを main にコンパイルします。(だからメインはコンパイルされています)この後、コードを追加したいと思います。

addthis.c:

void test()
{
   test();
}

ここで、(コンパイルされた) メインを使用し、addthis.c で再コンパイルします。それを実行すると(./mainWithAddthis)、印刷が2回表示されるはずです。

私はそれを明確に説明したことを願っています。誰でもアイデアはありますか?

4

5 に答える 5

6

の前方宣言が必要void test()ですvoid showme()。(コンパイルのみ)オプションを使用して各.cファイルをコンパイルします。-c

  • gcc -c addthis.c -o addthis.o
  • gcc -c main.c -o main.o

次に、2つのオブジェクトファイルを次のようにリンクします。

  • gcc main.o addthis.o -o main

その後、お楽しみください./main:-)

于 2011-05-09T20:03:03.223 に答える
2

の定義がないため、最初のコードはコンパイルされませんtest();

私が理解しているように、コンパイルされたメインを取得し、 addthis.oで生成されたコードを追加して、という名前の 2 番目のアプリケーションを作成しますmainWithAddthis。これは不可能です!

あなたは混乱しているか、ハードコアなトリックをしようとしています。

于 2011-05-09T20:01:21.587 に答える
0

実行可能ファイルの作成は2段階のプロセスです。

  1. (プロジェクト/メイクファイルで)指定したすべてのソースファイルに対して、コンパイラはオブジェクトファイルをビルドします
  2. (プロジェクト/メイクファイルで)指定したすべてのオブジェクトファイルについて、リンカはそれらをリンクし、実行可能ファイルを作成します

再コンパイルする1つの方法は、プロジェクト全体を再ビルドすることです。あなたは多かれ少なかれ同じ結果を得るでしょう。

しかし、あなたがやりたいのは、ソースファイルのみを再コンパイルしてから、古いバージョン(のためにコンパイルされたオブジェクトファイル)を新しいバージョンのにaddthis.c再リンクすることのようです。これを行う方法は、使用するコンパイラとビルドシステムに完全に依存します。main.omain.caddthis.o

main.oまた、このソリューションは、、、があり、addthis.cまったく同じコンパイラバイナリ/インストールがあり、コンパイラフラグがの生成に使用されている場合にのみ機能しますmain.o。これがすべてあなたの箱にあるなら、あなたはおそらく大丈夫です。

あなたがファイルaddthis.cとだけを持っているならmain.exe、あなたが望むことをするための移植可能な方法はありません。

于 2011-05-09T20:05:08.240 に答える
0

main.c

void f();
int main()
{
  f();
  return 0;
}

addon1.c

#include <stdio.h>
void f()
{
  printf("I am the ONE.\n");
}

addon2.c

#include <stdio.h>
void f()
{
  printf("I am the TWO.\n");
}

コンパイル

gcc -c main.c -o main.o
gcc -c addon1.c -o addon1.o
gcc -c addon2.c -o addon2.o
gcc main.o addon1.o -o main1
gcc main.o addon2.o -o main2

印刷するプログラムがあり./main1ます。./main2...ONE....TWO.

于 2011-05-09T20:24:38.610 に答える
0

16 進エディタを使って筋金入りの時間を費やさなければ、話していることを事後に実行することはできません。

ただし、事前に計画してソフトウェアに組み込む場合は、動的読み込みを使用して同じ効果を得ることができます。これは、多くのソフトウェアがプラグイン機能を提供する方法です。C でこれを行う一般的な方法については、 glib モジュールを確認してください。

于 2011-05-09T20:16:22.443 に答える