0

通常、Windows でコンパイルして.DLL.

配布できるように、Linux でコンパイルしたいと考えています。.a.so、またはファイルの束として配布するかどうかは気にしません.o

個々の.cファイルはすべて正常にコンパイルされます。しかし、すべてのファイルを含むテスト実行可能ファイルをコンパイルしようとすると.o、未定義の参照エラーが大量に発生します。

すべての.oファイルはフル パスとしてコマンド ラインにあり、欠落しているファイルに関するエラーは発生しません。

cc testctd.c -o testctd.out -lm -lc $LIBRARY-PATH/*.o

_open_writeなどへの未定義の参照もあります。

4

2 に答える 2

2

-l オプションが間違った場所にある

-図書館

-l ライブラリ

リンク時に library という名前のライブラリを検索します。(別の引数としてライブラリを使用する 2 番目の選択肢は、POSIX 準拠のみを目的としており、推奨されません。)

コマンドのどこにこのオプションを記述するかによって違いが生じます。リンカーは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。したがって、

foo.o -lz bar.o

ファイル foo.o の後、bar.o の前にライブラリ z を検索します。bar.o が z の関数を参照する場合、それらの関数はロードされない可能性があります。

リンカは、ライブラリのディレクトリの標準リストを検索します。これは、実際には liblibrary.a という名前のファイルです。リンカーは、このファイルを名前で正確に指定されているかのように使用します。

于 2010-11-01T15:09:28.707 に答える
2

あなたは完全な答えを得るのに十分な情報を提供していませんが、私はあなたの問題の1つを知っていると思います.関数open、、、、などはread、 Windowswriteではclose名前の前にアンダースコアがありますが、Linux(またはその他のその点についてはUnix)。コンパイラは、ファイルをコンパイルしたときに警告を表示する必要があり.cます。警告が表示されない場合は、警告をオンにしてください。とにかく、これらのアンダースコアをすべて削除する必要があります。次のようなヘッダー ファイルをお勧めします。

#ifdef _WIN32
#define open(p, f, m) _open(p, f, m)
#define read(f, b, n) _read(f, b, n)
#define write(f, b, n) _write(f, b, n)
#define close(f) _close(f)
/* etc */
#endif

実際のコードではアンダースコアなしの名前のみを使用してください。

また、-lオプション ( など) は、すべてのオブジェクト ファイルの-lmに配置する必要があります。指定する必要はありません (また、難解すぎてここに入ることができない状況では、問題が発生する可能性があります)。-lc

于 2010-11-01T15:06:52.367 に答える