web-dev-qa-db-ja.com

curl_global_init、curl_easy_init、およびその他の関数への未定義の参照(C)

CでCurlを使用しようとしています。

Curlの公式ページにアクセスし、サンプルソースコードをコピーしました。

以下はリンクです: http://curl.haxx.se/libcurl/c/sepheaders.html

コマンド「gcc test.c」でこのコードを実行すると、

コンソールには次のようなメッセージが表示されます。

/tmp/cc1vsivQ.o: In function `main':
test.c:(.text+0xe1): undefined reference to `curl_global_init'
test.c:(.text+0xe6): undefined reference to `curl_easy_init'
test.c:(.text+0x10c): undefined reference to `curl_easy_setopt'
test.c:(.text+0x12e): undefined reference to `curl_easy_setopt'
test.c:(.text+0x150): undefined reference to `curl_easy_setopt'
test.c:(.text+0x17e): undefined reference to `curl_easy_cleanup'
test.c:(.text+0x1b3): undefined reference to `curl_easy_cleanup'
test.c:(.text+0x1db): undefined reference to `curl_easy_setopt'
test.c:(.text+0x1e7): undefined reference to `curl_easy_perform'
test.c:(.text+0x1ff): undefined reference to `curl_easy_cleanup'

これを解決する方法がわかりません。

43
Juneyoung Oh

ライブラリとリンクしていません。

外部ライブラリを使用する場合は、linkを使用する必要があります。

$ gcc test.c -lcurl

最後のオプションは、GCCにリンク(-l)ライブラリcurlを使用します。

85

Joachim Pileborgの答えに加えて、gcc/g ++リンクは順序に敏感であり、リンクされたライブラリはそれらに依存するものに従う必要があることを覚えておくと便利です。

$ gcc -lcurl test.c

失敗します、以前と同じシンボルが欠落しています。この事実を忘れてこのページに来たので、私はこれに言及します。

22
chirality

私は同じ問題を抱えていますが、メイクファイルでg ++を使用しています。これはリンカーの問題です。コンパイラーとリンカーにオプション-lcurlを追加する必要があります。私の場合、メイクファイルで:

CC ?= gcc
CXX ?= g++
CXXFLAGS += -I ../src/ -I ./ -DLINUX -lcurl  <- compile option
LDFLAGS += -lrt -lpthread -lcurl      <- linker option

ジェラルド

1
Gerard

どれほど悪いことかによっては、ライブラリがどこにあるかをリンカに知らせるために、LDFLAGSの-L/somewhereが必要になる場合があります。 ldconfigは、すべてのブートでそれらをピックアップして検出することになっていますが、新しいマシンでは、/ etc/ld.so.confにディレクトリを追加するなど、少し時間がかかります。

0
Alan Corey