2

私は C プログラミングを始めたばかりで、他の C ライブラリの使用方法を学ぼうとしています。glfwの例を実行しようとしていますが、ライブラリのリンク/インクルードに問題があります。別のディレクトリにあるライブラリをダウンロードしました。また、どのコマンドを使用すればよいかについても少し混乱しています: make, cmake, cc,gccなど. C プログラムでこのライブラリをコンパイルするにはどうすればよいですか?

更新:わかりにくかったら申し訳ありません。この質問に対する答えは非常に単純です。私はMacを使っています。意図的に IDE を使用していません。上記でリンクしたスクリプトは次のとおりです。

#include <GLFW/glfw3.h>

int main(void)
{
    /* code here, not relevant to question */
}

ライブラリをダウンロードして解凍すると、次のようになります。

glfw-3.0.2/
├── CMake
├── CMakeFiles
├── deps
├── docs
├── examples
├── include
├── src
├── Makefile
├── README.md

readme では、次のように cmake を使用してビルドするように記載されています。

cd glfw-3.0.2
cmake .

このコマンドの出力は、次のステートメントで終了します。

-- ビルド ファイルは次の場所に書き込まれています: /Users/andrew/mydirectory/myproj/glfw-3.0.2

私のスクリプトは、ディレクトリよりも 1 レベル上のglfw-3.0.2ディレクトリにあります。

スクリプトをコンパイルしようとすると、ライブラリを含める方法をコンパイラに指示する必要がありますが、それは方法がわからない部分です。

$ make myscript
cc     myscript.c   -o myscript
myscript.c:1:10: fatal error: 'GLFW/glfw3.h' file not found
#include <GLFW/glfw3.h>
         ^
1 error generated.
make: *** [myscript] Error 1

ライブラリの場所をコンパイラに伝えるにはどうすればよいですか? また、一度コンパイルすれば、スクリプトに「バンドル」されるため、元のライブラリ ディレクトリを保持することを心配する必要はないと思います。その仮定は正しいですか?

4

3 に答える 3

1

あなたが説明しているエラーは、HEREが示しているものと概念的に一貫しています。次のように .h ファイルを含むディレクトリを含めてみましたか: `gcc -I../GLFW ...'。ここで、'../' はスクリプトの場所から 1 つのディレクトリに移動するはずです。

また、バンドルに関しては、ビルド後の .exe にも同じ規則が適用されます。つまり、.exe が依存するすべての .dll は、.exe から見えるようにする必要があります (たとえば、システム ディレクトリまたはローカル ディレクトリ内)。これが自動的に行われるとは思いませんが、読むことができるgcc -bundleオプションがあります。

于 2013-09-23T23:01:32.993 に答える
1

これがこの投稿を見つけた人にとって役立つ場合に備えて、サードパーティの C ライブラリのビルド/コンパイルに関連して学んだことを要約します。

  • cmakeを構築するためのツールですMakefiles

  • makeを使用して構成オプションをコンパイラに渡すためのツールです。Makefile

  • gccccは、2 つの異なるコンパイラの実装です。コマンドライン フラグの引数は似ていますが、実装が異なるため、フラグが異なる場合があります。

重要なフラグの概要は次のとおりです。

-I (capital i) Include a directory of header files.
-L Include a library directory.
-l (lowercase L) Link to a library that has already been compiled.

システム全体で ( を使用してmake install) コンパイルおよびインストールしたライブラリは、ライブラリを含めるときにコンパイラが参照する場所にライブラリが配置されているため、コンパイラで自動的に使用できるようになります。-Iこれは、フラグとフラグを使用する必要がないことを意味します-L

-lシステム全体にインストールされているライブラリを使用して独自のプログラムをコンパイルする場合、ライブラリの名前にリンクするフラグを渡すだけで済みます。私の場合、次のようになります。

cc myscript.c -lglfw3
于 2013-09-24T21:27:03.183 に答える