1

すべてのファイルが同じディレクトリ (デスクトップ) にある作業セットアップがあります。ターミナル出力は次のようになります。

$ gcc -c mymath.c
$ ar r mymath.a mymath.o
ar: creating archive mymath.a
$ ranlib mymath.a
$ gcc test.c mymath.a -o test
$ ./test
Hello World!
3.14
1.77
10.20

ファイル:

mymath.c:

float mysqrt(float n) {
  return 10.2;
}

test.c:

#include <math.h>
#include <stdio.h>
#include "mymath.h"

main() {
  printf("Hello World!\n");
  float x = sqrt(M_PI);
  printf("%3.2f\n", M_PI);
  printf("%3.2f\n", sqrt(M_PI));
  printf("%3.2f\n", mysqrt(M_PI));
  return 0;
}

ここで、アーカイブ mymath.a をサブディレクトリ /temp に移動します。リンクを機能させることができませんでした:

$ gcc test.c mymath.a -o test -l/Users/telliott_admin/Desktop/temp/mymath.a
i686-apple-darwin10-gcc-4.2.1: mymath.a: No such file or directory

$ gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -lmymath
ld: library not found for -lmymath
collect2: ld returned 1 exit status

私は何が欠けていますか?どのリソースをお勧めしますか?

更新: ご協力ありがとうございます。すべての答えは基本的に正しかった。私はそれについてここにブログを書きました。

4

3 に答える 3

2
$ gcc test.c /Users/telliott_admin/Desktop/temp/mymath.a -o test

編集:gccは、静的ライブラリのライブラリへのフルパスのみを必要とします。-Lを使用して、gccが-lと組み合わせて検索するパスを指定します。

于 2010-02-02T20:16:00.110 に答える
1

ldが-lを使用してライブラリを検索するには、パターンlibyourname.aに従って名前を付ける必要があります。次に、-lmymathを使用します

したがって、-lを指定して/temp/mymath.aを取得する方法はありません。

libmymath.aという名前を付けた場合、-L /temp-lmymathがそれを見つけます。

于 2010-02-02T20:17:16.973 に答える
1

数学ライブラリを含めるには、-lmath ではなく -lm を使用します。また、リンク時にライブラリを含めるには、サブディレクトリで -L を使用する必要があります (-I はコンパイル用のヘッダーのみを含めます)。

次のものをコンパイルしてリンクできます。

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp /Users/telliott_admin/Desktop/temp/mymath.a

または

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -L/Users/telliott_admin/Desktop/temp -lmymath

mymath.a は libmymath.a に名前が変更されます。

-l の使用方法に関するコメント (「悪いプログラミング」を検索) については、リンク テキストを参照してください。

于 2010-02-02T20:03:42.927 に答える