如何编译包含来自另一个库的头的C程序?
我正在开始C编程,并试图学习如何使用其他C库。我正在尝试运行,但链接/包括库时遇到问题。我已经下载了这个库,它存在于一个单独的目录中。对于应该使用哪个命令,我也有点困惑:如何编译包含来自另一个库的头的C程序?,c,C,我正在开始C编程,并试图学习如何使用其他C库。我正在尝试运行,但链接/包括库时遇到问题。我已经下载了这个库,它存在于一个单独的目录中。对于应该使用哪个命令,我也有点困惑:make,cmake,cc,gcc,等等。我应该如何用我的C程序编译这个库 更新:如果我不清楚,很抱歉。这个问题的答案应该很简单。我在Mac电脑上。我故意不使用IDE。下面是我在上面链接的脚本: #include <GLFW/glfw3.h> int main(void) { /* code here, n
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
cd glfw-3.0.2
cmake .
cc myscript.c -lglfw3
此命令的输出以以下语句结束:
--生成文件已写入:/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
$make myscript
cc myscript.c-o myscript
myscript.c:1:10:致命错误:“未找到GLFW/glfw3.h”文件
#包括
^
生成1个错误。
生成:**[myscript]错误1
如何告诉编译器在哪里可以找到库?此外,我假设一旦编译它,我就不必担心保留原始库目录,因为它将与我的脚本“捆绑”在一起。这个假设正确吗?您描述的错误在概念上与它们所显示的一致。您是否尝试过像这样包含包含.h文件的目录:`gcc-I../GLFW…',其中我认为“../”应该占用相对于脚本位置的一个目录
此外,关于绑定,在生成后,相同的规则将应用于.exe。也就是说,您的.exe所依赖的任何.dll都需要对.exe可见(例如,在系统目录或本地目录中)。我不认为这是自动发生的,但是有一个gcc-bundle选项可以阅读。您描述的错误在概念上与它们显示的一致。您是否尝试过像这样包含包含.h文件的目录:`gcc-I../GLFW…',其中我认为“../”应该占用相对于脚本位置的一个目录
此外,关于绑定,在生成后,相同的规则将应用于.exe。也就是说,您的.exe所依赖的任何.dll都需要对.exe可见(例如,在系统目录或本地目录中)。我不认为这会自动发生,但您可以阅读一个gcc-bundle选项。只是运行
cmake。
实际上并没有构建或安装库。它只是创建和配置构建库所需的构建文件。通常,您需要运行以下命令:
cmake .
make
sudo make install
默认情况下,cmake/make将假定安装的目标是/user目录,组件将进入/usr/bin、/usr/lib和/usr/include。这就是为什么您必须通过sudo运行“makeinstall”。如果您有sudo权限,这可能是最简单的方法,因为它会将库和包含文件放在编译程序时自动找到它们的位置
如果不想将GLFW安装到/usr中,可以使用cmake的参数指定安装目录。例如:
cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/glfw .
但是,如果您这样做,现在将由您在程序的makefile中指定在何处查找库和include文件。这是通过使用cc-I标志来指定包含文件的路径,使用cc-L标志来指定库的位置,使用cc-L标志来指定要链接到的库来完成的。例如,如果您在主目录中安装了GLFW库:
cc -I $HOME/glfw/include -L $HOME/glfw/lib -o myscript myscript.c -lglfw
仅仅运行
cmake.
实际上并没有构建或安装库。它只是创建和配置构建库所需的构建文件。通常,您需要运行以下命令:
cmake .
make
sudo make install
默认情况下,cmake/make将假定安装的目标是/user目录,组件将进入/usr/bin、/usr/lib和/usr/include。这就是为什么您必须通过sudo运行“makeinstall”。如果您有sudo权限,这可能是最简单的方法,因为它会将库和包含文件放在编译程序时自动找到它们的位置
如果不想将GLFW安装到/usr中,可以使用cmake的参数指定安装目录。例如:
cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/glfw .
但是,如果您这样做,现在将由您在程序的makefile中指定在何处查找库和include文件。这是通过使用cc-I标志来指定包含文件的路径,使用cc-L标志来指定库的位置,使用cc-L标志来指定要链接到的库来完成的。例如,如果您在主目录中安装了GLFW库:
cc -I $HOME/glfw/include -L $HOME/glfw/lib -o myscript myscript.c -lglfw
如果这对找到这篇文章的人有帮助,我将总结一下我在构建/编译第三方C库方面学到的东西
是一种用于构建cmake
的工具makefile
是一种使用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.
编译和安装系统范围的库(使用makeinstall
)将自动对编译器可用,因为