C ++プログラムの1つでCURLを使用するたびに、フラグをフラグ-lcurl
としてに追加する必要がありますg++
。これは、Eclipseで作業するときに特に厄介になる可能性があります。存在する場合/usr/include/curl/curl.h
、CURLを常にインクルードパス内に含めるにはどうすればよいg++
ですか?
3 に答える
tl; dr:フラグを追加する必要があります。
リンカには、コンパイラではなくlibcurlが必要です。コンパイラにはヘッダーが必要です。リンカにはlibが必要です。
物事をかなり単純化するために、ヘッダーファイルは、宣言が後で定義されることをコンパイラーに通知します。libcurlは実際にそれらを定義するものです。
リンカは、何に対してリンクするかを推測してチェックしません(そうすることは恐ろしい考えです)。リンク先を明示的に指定する必要があります(デフォルトのライブラリを除く)。特に、リンカは、curl.hがレイアウトした宣言を見つけるためにlibcurlを使用することを知っている必要があります。libcurlがないと、リンカーに関数がないため、完全なバイナリを生成できません。
私はEclipseに精通していませんが、追加のライブラリを指定できるオプションがあることはほぼ間違いありません。はい、プロジェクトごとに1回実行する必要がありますが、それが大きなオーバーヘッドになることはありません。
にカールパスを追加してみてください
プロパティ->C/ C ++一般->パスとシンボル:
これは、CおよびC++でのリンクの仕組みです。
プログラムをコンパイルするときは、ヘッダーファイルをインクルードします
/usr/include/curl/curl.h
。コンパイラがこの部分を実行します。ヘッダーファイルには、ライブラリインターフェイスのすべての定義が含まれています。プログラムをリンクするときは、ライブラリ
/usr/lib/libcurl.so
、またはたまたま名前が付けられているものにリンクします。リンカがこの部分を行います。ライブラリには、ロード可能(動的ライブラリの場合)またはリンク可能(静的ライブラリの場合)のいずれかの形式で実装が含まれています。
CおよびC++言語には、リンクするライブラリを指定する方法がないため-lcurl
、リンカに渡す必要があります。これはまさにその通りです。
CおよびC++にはいくつかの拡張機能があり、たとえば#pragma comment
MSCを使用して、ソースコードでライブラリの依存関係をエンコードできますが、私が知る限り、これらは通常のELFツールチェーンではサポートされていません。
注:実際には、-lcurl
フラグはのためg++
ではありませんが、リンカーのためのものld
です。-lcurl
に渡すときは、リンカーに渡しますg++
。g++