Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编译包含来自另一个库的头的C程序?_C - Fatal编程技术网

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

如何编译包含来自另一个库的头的C程序?,c,C,我正在开始C编程,并试图学习如何使用其他C库。我正在尝试运行,但链接/包括库时遇到问题。我已经下载了这个库,它存在于一个单独的目录中。对于应该使用哪个命令,我也有点困惑:make,cmake,cc,gcc,等等。我应该如何用我的C程序编译这个库 更新:如果我不清楚,很抱歉。这个问题的答案应该很简单。我在Mac电脑上。我故意不使用IDE。下面是我在上面链接的脚本: #include <GLFW/glfw3.h> int main(void) { /* code here, n

我正在开始C编程,并试图学习如何使用其他C库。我正在尝试运行,但链接/包括库时遇到问题。我已经下载了这个库,它存在于一个单独的目录中。对于应该使用哪个命令,我也有点困惑:
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
)将自动对编译器可用,因为