如何编译包含来自另一个库的头文件的C程序?

时间:2013-09-23 18:34:07

标签: c

我开始使用C编程,并且正在尝试学习如何使用其他C库。我正在尝试让glfw example运行,但无法链接/包含库。我已经下载了库,它存在于一个单独的目录中。关于我应该使用哪个命令,我也有点困惑:makecmakeccgcc等。我该怎么做才能编译这个库用我的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
像这样的

In the readme, it says to build it using 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

如何告诉编译器在哪里找到库?此外,我假设一旦我编译它,我不需要担心保留原始库目录,因为它将与我的脚本“捆绑”。这个假设是否正确?

3 个答案:

答案 0 :(得分:2)

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

cmake .
make 
sudo make install

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

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

cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/glfw .

但是,如果执行此操作,现在由您决定在程序的makefile中指定库和包含文件的位置。这是通过使用cc -I标志指定包含文件的路径,使用cc -L标志指定库的位置以及指定要链接到的库的cc -l标志来完成的。例如,如果您已在主目录中安装了GLFW库:

cc  -I $HOME/glfw/include -L $HOME/glfw/lib -o myscript   myscript.c -lglfw  

答案 1 :(得分:1)

您所描述的错误在概念上与其显示的内容一致 HERE 。您是否尝试过包含.h文件的目录,如下所示:`gcc -I ../ GLFW ...',我相信'../'应该会占用一个相对于脚本位置的目录。

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

答案 2 :(得分:1)

如果这对找到这篇文章的人有帮助,我将总结我所学到的与构建/编译第三方C库有关的事情。

  • cmake是用于构建Makefiles的工具。

  • make是使用Makefile

  • 将配置选项传递给编译器的工具
  • gcccc是两种不同的编译器实现。他们的命令行标志参数类似,但同样,它们是不同的实现,因此它们的标志可能会有所不同。

以下是重要标志的摘要:

-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