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

在自述文件中,它说使用 cmake 构建它,如下所示:

cd glfw-3.0.2
cmake .

此命令的输出以以下语句结束:

-- 构建文件已写入:/Users/andrew/mydirectory/myproj/glfw-3.0.2

我的脚本位于比该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

2

只是运行cmake .实际上并不构建或安装库。它只是创建和配置构建库所需的构建文件。通常,您需要运行以下命令:

cmake .
make 
sudo make install

默认情况下,cmake/make 将假定安装目标是 /user 目录,组件进入 /usr/bin、/usr/lib 和 /usr/include。这就是你必须通过 sudo 运行“make install”的原因。如果您有 sudo 权限,这可能是最简单的路径,因为它会将库和包含文件放在您编译程序时会自动找到的位置。

如果您不想将 GLFW 安装到 /usr 中,您可以使用 cmake 的参数指定安装目录。例如:

cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/glfw .

但是,如果您这样做,现在将由您在生成文件中为您的程序指定在哪里找到库和包含文件。这是通过使用 cc -I 标志来指定包含文件的路径、使用 cc -L 标志来指定库的位置以及使用 cc -l 标志来指定要链接到的库来完成的。例如,如果您在主目录中安装了 GLFW 库:

cc  -I $HOME/glfw/include -L $HOME/glfw/lib -o myscript   myscript.c -lglfw  
于 2013-09-23T23:40:20.460 回答
1

您描述的错误在概念上与他们在此处显示的内容一致。您是否尝试过像这样包含包含 .h 文件的目录:`gcc -I../GLFW ...',我相信 '../' 应该将您带到一个相对于您的脚本位置的目录。

此外,关于捆绑,相同的规则将适用于您构建后的 .exe。也就是说,您的 .exe 所依赖的任何 .dll 都需要对 .exe 可见(例如,在系统目录或本地目录中)。我不认为这会自动发生,但是您可以阅读gcc -bundle选项。

于 2013-09-23T23:01:32.993 回答
1

如果这对任何找到这篇文章的人有帮助,我将总结一下我学到的与构建/编译第三方 C 库相关的东西。

  • cmake是构建的工具Makefiles

  • make是一种工具,用于将配置选项传递给编译器,使用Makefile

  • gcc并且cc是两种不同的编译器实现。它们的命令行标志参数相似,但同样,它们是不同的实现,因此它们的标志可能会有所不同。

以下是重要标志的摘要:

-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)编译和安装的库会自动可供编译器使用,因为该库已放置在编译器在包含库时会看到的位置。这意味着您不必使用-Iand-L标志。

当您使用系统范围内安装的库编译您自己的程序时,您只需传递-l标志以链接到库的名称。就我而言,它看起来像这样:

cc myscript.c -lglfw3
于 2013-09-24T21:27:03.183 回答