我开始使用C编程,并且正在尝试学习如何使用其他C库。我正在尝试让glfw example运行,但无法链接/包含库。我已经下载了库,它存在于一个单独的目录中。关于我应该使用哪个命令,我也有点困惑: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
像这样的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
如何告诉编译器在哪里找到库?此外,我假设一旦我编译它,我不需要担心保留原始库目录,因为它将与我的脚本“捆绑”。这个假设是否正确?
答案 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
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
)将自动变为编译器可用,因为库已放置在编译器查找包含库时的位置。这意味着您不必使用-I
和-L
标记。
使用系统安装的库编译自己的程序时,只需传递-l
标志即可链接到库的名称。就我而言,它看起来像这样:
cc myscript.c -lglfw3