9

インターネットでとても素敵なオープンソースライブラリを見つけたとしましょう。今はそれを自分のプロジェクトに使用したいと思います。

私はそれをダウンロードし、おそらくそれをコンパイルして、ヘッダーファイルと静的/動的ライブラリを取得します。

そのため、独自のソースファイルを作成し始めます。もちろん、この外部ライブラリの機能を使用する場合は、その適切なヘッダーをソースファイルに含めます。

次に、ソースファイルをコンパイルし、この外部ライブラリのインクルードパスとリンカーオプションが正しく設定されていることを確認します。

そして、私はエラーの山を受け取ります。それらはすべて外部ヘッダーから来ています。いくつかのコンパイラフラグが必要であることがわかりました。

(外部ライブラリからヘッダーをコンパイルできるようにするために)設定する必要のある最小限のコンパイラフラグを見つけるにはどうすればよいですか?

私がこれまでに考えたこと:

  1. ソースの構築スクリプトでそれらを調べます(定義できる場所がたくさんあり、すべてのヘッダーに一緒に必要な場合があるが、特定のヘッダーには必要ないため、最小フラ​​グではない場合があるため、非常に難しい場合があります)私が使う)
  2. グーグルはすべてのエラーメッセージとうまくいけばそれが答えを与えるでしょう(多くのエラーメッセージで難しいかもしれません、そしてグーグルは答えを知らないかもしれません、または私は答えを見つけるための正しいキーワードを知らないかもしれません)
  3. どういうわけか、外部ライブラリのビルドスクリプトを自分のプロジェクトに「含める」ことができます(別のビルドシステムを使用したい場合があり、ビルドシステムを自分で完全に理解する必要があるため、非常に難しい場合があります。これは難しい場合があります。より大きなライブラリの場合)
4

2 に答える 2

1

正常に動作するオープン ソース ライブラリには、開発ファイルの使用方法に関する指示が付属しています。GNU/Linux システムでは、通常、pkg-configファイル (*.pc) を開発ヘッダーとライブラリに一緒にインストールします。この場合、pkg-config --cflags library-name必要なコンパイル オプションが示されます。

どこpkg-configで使用できるかは、インポートしたいコンポーネントをビルドシステムに伝えるだけの問題です。たとえば、autotools で。

PKG_CHECK_MODULES([DEPS], [libname])

そして、.am ファイルの変数DEPS_CFLAGSと変数を使用します。DEPS_LIBS

たとえば、シェルのコマンドラインで:

$ gcc $(pkg-config --cflags libname) -c main.c
$ gcc $(pkg-config --libs libname) main.o -o test.exe

とにかく、使用されているライブラリと生成されているエラーに関する特定の情報を投稿できれば、より生産的になります。

于 2012-08-28T17:32:08.383 に答える
0

ヘッダーの場合、コンパイラのフラグに関するエラーが発生することは非常にまれです。または、そのヘッダーでエラーを解決するのは非常に簡単です (たとえば、#ifdef..#endif を使用するか、more wel を使用してコードの一部を書き直してみてください)。既知のパターン)。

しかし、より多くの可能性のあるエラーは次のようなものです:ヘッダーを直接インクルードしますが、そのヘッダーは他のヘッダー(おそらくシステムまたは同じライブラリから)に依存しており、メインのインクルードファイルの前にそれらをインクルードするのを忘れています.(実際、これは間の共通ファイルですヘッダーをスタンドアロンにするのを忘れているプログラマーは、ファイルの必要なすべてのヘッダーを正しい順序でメインのインクルード ファイルに含めるのを忘れているだけです)。

したがって、この基準をテストするには、ライブラリのソースコードを調べます(正しくコンパイルされていると言います)。メインのインクルード ファイルの前に何が含まれているかを確認すると、そのインクルード ファイルがその前に含まれていたインクルード ファイルに依存していることがわかる場合があります。

たとえば、MSVC と GCC の両方で、プリコンパイル済みヘッダーを使用できます。プリコンパイル済みヘッダーに含まれるインクルードは、それをインクルードするすべてのソース ファイルに自動的に含まれます。あなたのコードは正しくコンパイルされますが、誰かがあなたのパブリック ヘッダーをインクルードするとエラーが発生します。

または、何かを定義private_header_1.hしてパブリックヘッダーで使用し、次にソースファイルで使用する場合(たとえばimpl.cpp#include "private_header_1.h" #include "public_header.h" もう一度コードは正しくコンパイルされますがpublic_header.h、別のコードに含めるとエラーが発生します

于 2012-08-26T20:39:33.450 に答える