8

cでrabbitmqに接続しようとしていますが、毎回失敗します。これが私がそれをした方法です。

ダウンロードしたrabbitmq-c 依存関係が満たされていることを確認するために
インストールしました( )。 Rebuilt usingを使用して 接続変数を変更し、実行して機能しました 。次に、独自のファイルを作成し、gccを使用してそれらをコンパイルし始めました。 make && make install
amqp_sendstring.c
make./amqp_sendstring

gcc -lrabbitmq -o j_test test.c

皮肉なことに、以下のエラーでlibrabbitmqとのリンクに失敗します。

/tmp/cc63IlXq.o: In function `main':
test.c:(.text+0xa): undefined reference to `amqp_new_connection'
test.c:(.text+0x1a): undefined reference to `amqp_destroy_connection'
collect2: ld returned 1 exit status

ampq_*で始まるものをすべて削除しました。出来上がり!正常に構築されました。これは、gccがヘッダーを検出できるが、libは検出できないことを示しています。

test.cのソースコードは次のとおりです。

#include <amqp.h>
#include <amqp_framing.h>
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}

誰かが私を正しい方向に向けてくれませんか?

編集:私はubuntuボックス(12.04)にいることを言及するのを忘れました。ただし、上記のステートメントで暗黙的に暗示されていると考えてください。

4

1 に答える 1

8

プログラムをコンパイルするときはgcc、使用するライブラリの名前 ( ) だけでなく、リンク時に-lrabbimtqライブラリを検索するパス (ディレクトリ) も指定する必要があります ( )。(またはリンカー) は常にいくつかのデフォルト ディレクトリを探しますが、rabbitmq-cライブラリはそれらのディレクトリでは利用できません。-L/path/to/rabbitmq-cgcc

したがって、gccコマンドラインは次のようになります。

gcc -I/path/to/rabbitmq-c-header-dir -L/path/to/rabbitmq-c-lib-dir -o j_test test.c -lrabbitmq

-Iヘッダー ファイル ( ) の場所を指定する必要があり、その位置 -lrabbitmqが重要であることに注意してください。

以下の例のディレクトリ~/src/rabbitmq-cは、rabbitmq-c の私のクローンの場所です。

ヘッダーと共有ライブラリの場所:

~/src/rabbitmq-c$ find . -name amqp.h
./librabbitmq/amqp.h
~/src/rabbitmq-c$ find . -name librabbitmq.so
./librabbitmq/.libs/librabbitmq.so
~/src/rabbitmq-c$

サンプル プログラムのコンパイルとリンク:

~/src/rabbitmq-c$ cat > stacko.c
#include <amqp.h>
#include <amqp_framing.h>
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}
~/src/rabbitmq-c$ gcc -Ilibrabbitmq -g -Wall -c stacko.c
~/src/rabbitmq-c$ gcc -Llibrabbitmq/.libs -g -Wall -o stacko stacko.o -lrabbitmq
~/src/rabbitmq-c$

共有ライブラリを使用すると、実行時にライブラリがどこにあるかを伝える必要があります。

~/src/rabbitmq-c$ ./stacko 
./stacko: error while loading shared libraries: librabbitmq.so.0: cannot open shared object file: No such file or directory
~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ./stacko 
~/src/rabbitmq-c$

実行可能ファイルが使用するライブラリを確認できますldd:

~/src/rabbitmq-c$ ldd ./stacko 
    linux-gate.so.1 =>  (0x00d7d000)
    librabbitmq.so.0 => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00396000)
    /lib/ld-linux.so.2 (0x002d6000)
~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ldd ./stacko 
    linux-gate.so.1 =>  (0x001c8000)
    librabbitmq.so.0 => librabbitmq/.libs/librabbitmq.so.0 (0x00f77000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x001c9000)
    /lib/ld-linux.so.2 (0x00cc3000)
~/src/rabbitmq-c$

g++: ライブラリ パスの設定を指定する方法も参照してください。.

于 2012-08-21T20:18:05.857 に答える