0

簡単な紹介:-(GCCバージョン4.6.3、OS-Ubuntu 12.04、mongoose Webサーバープログラムを回避しているので、「make」コマンドを実行してmongooseをコンパイルおよびインストールすると、タスクは正常に実行されます)。

[質問のパート1] この質問は、stackowerflowに関するこの投稿を参照しています。

mongooseWebサーバーのhelloworldプログラム

Valenokは、この投稿にhelloサンプルプログラムへのリンクを提供することで回答しました。

基本的に、私はこのリンクで与えられたサンプルのhelloプログラムコードをコンパイルしようとしています:-

http://code.google.com/p/mongoose/source/browse/examples/hello.c

このコードをmongooseのコンパイル済みディレクトリに配置します(ディレクトリにはmongoose.hファイルがあります)

以下は、helloプログラムをコンパイルするためのコマンドライン出力です。

akshay@akshay-Inspiron-N5010:~$ gcc mongoose/hello.c -o mongoose/hello
/tmp/ccroC5Z6.o: In function `callback':
hello.c:(.text+0x32): undefined reference to `mg_get_request_info'
hello.c:(.text+0x96): undefined reference to `mg_printf'
/tmp/ccroC5Z6.o: In function `main':
hello.c:(.text+0xee): undefined reference to `mg_start'
hello.c:(.text+0x103): undefined reference to `mg_stop'
collect2: ld returned 1 exit status
akshay@akshay-Inspiron-N5010:~$ 

[質問のパート2]

ここで、mongoose.cファイルにmg_stop、mg_start、mg_printf、mg_get_request_infoの実装が見つかったので、-cオプションを指定してmongoose.cファイルを次のようにコンパイルします:gcc -c -o mongoose.o mongoose.c

私の質問は:-に似ていると思います

*.hファイルで宣言された関数への未定義の参照

しかし、libmongoose.soをgccの-Lオプションとリンクすると、次のエラーが発生します:-( libmongoose.soは同じディレクトリにあります。mycwd)

akshay@akshay-Inspiron-N5010:~/mongoose$ gcc -L libmongoose.so -o hello hello.o mongoose.o
mongoose.o: In function `mg_start_thread':
mongoose.c:(.text+0x1369): undefined reference to `pthread_create'
mongoose.o: In function `load_dll':
mongoose.c:(.text+0xa955): undefined reference to `dlopen'
mongoose.c:(.text+0xa9b4): undefined reference to `dlsym'
collect2: ld returned 1 exit status

また、libmongoose.soを使用せずにコンパイルすると、上記の^^エラーが発生し続けます。

[編集]:gccに-pthreadオプションを追加しましたが、まだエラーが表示されます:-mongoose.o:関数load_dll': mongoose.c:(.text+0xa955): undefined reference todlopen'でmongoose.c:(。text+ 0xa9b4): `dlsym'への未定義の参照collect2:ldが1つの終了ステータスを返しました

私の質問のパート1とパート2について:これらのエラーを取り除き、hello.cプログラムサンプルを正常に実行したいと思います。前もって感謝します 。

4

1 に答える 1

4

この-Lオプションは、ライブラリへのリンクには使用されません。ダイナミックライブラリの検索パスを指定するために使用されます。特定のライブラリに対してリンクするには、を使用します-lmongoose.oただし、との両方に対してリンクする必要はありませんlibmongoose.so。どちらか一方で十分です。

Linuxでは、pthreadおよび動的ローディングライブラリに対してもリンクする必要があります。これは、C標準ライブラリの一部であるにもかかわらず、に存在しないためですlibc.so。もう1つ注意しなければならないのは、binutilsの最近のバージョン(具体的には、のld)では、ライブラリとオブジェクトファイルを、シンボルが相互に依存する順序で指定する必要があることです。つまり、ライブラリはコマンドラインの最後に移動する必要があります。

全体として、次のコマンドのいずれかを使用します。

gcc -o hello hello.o mongoose.o -ldl -lpthread

また

gcc -L. -o hello hello.o -lmongoose -ldl -lpthread
于 2012-12-28T08:46:03.367 に答える