1

私はGCCを使用して静的ライブラリを実行する方法をここで見ていました. )、およびメイン関数 (main.c) であり、それらはすべてホーム ディレクトリにあります。

事実.h

int fact (int);

事実.c

int
fact (int f) {
  if ( f == 0 )
    return 1;
else
    return (f * fact ( f - 1 ));
}

main.c

#include <stdio.h>
#include "fact.h"
int main(int argc, char *argv[])
{
        printf("%d\n", fact(3));
        return 0;
}

そのため、最初にオブジェクト ファイルを生成する必要がありました (フェーズ 1)...

$ gcc -c fact.c -o fact.o 

...次に、静的ライブラリを生成します (フェーズ 2)...

$ ar rcs libfact.a fact.o

...後でスタティック ライブラリのリンク プロセスを実行します (フェーズ 3)...

$ gcc -static main.c -L. -lfact -o fact

...そして最後にプログラムを実行します (フェーズ 4 と最終)

$ ./fact 

私の質問は次のとおりです。私のプログラムが非常に大きくなり、ヘッダーをヘッダー ディレクトリ (/include/fact.h) に置き、静的ライブラリも別のディレクトリ (/lib/libfact.a) に置く以外に選択肢がないとします。その場合、このプログラムのコンパイルおよび/またはコードはどのように変更されますか?

編集/解決済みの問題: まず、include と呼ばれる別のディレクトリにヘッダーを含めるために、main.c が修正されました。この場合、両方の .c ファイルがメイン ディレクトリにあることに注意してください。

main.c

#include <stdio.h>
#include "include/fact.h"
int main(int argc, char *argv[])
{
        printf("%d\n", fact(3));
        return 0;
} 

次に、スタティック ライブラリを別のディレクトリに生成する (フェーズ 2) ため、次のようにしました。

$ ar rcs lib/libfact.a fact.o
4

2 に答える 2

3

これがあなたの答えです。

$ gcc -static main.c -L. -事実 -事実

-L 検索するディレクトリのリストにディレクトリを追加します -l

あなたが与えたリンクにあります。検索方向を正しく設定し、検索範囲を低くすれば問題ありません。そうしないと、コードがコンパイルされません。コードがヘッダーの場所を知らなかったからです。

于 2013-04-09T15:41:56.363 に答える
2

-I を追加して、インクルード パスを指定できます。

gcc -I/include fact.c

gcc -I/include -static main.c -L/lib -lfact -o fact_main
于 2013-04-09T15:56:20.867 に答える