你怎么实际使用C库?

我确信这个问题已经被问了很多次了,但我无法弄清楚。 忍受着我

所以当你下载一个库时,你会得到一堆.c和.h文件,还有很多其他的东西。 现在说你想用这个库编写一个程序。

我将所有.h文件复制到我的项目目录中。 它只是不编译

太棒了,所以我把这个库当作一堆.dll文件,然后我把这个dll复制到我的工程目录中。 仍然不编译。

这个怎么用?

你做什么,就像在为你的项目创build文件夹之后一样? 库文件包的哪些部分是复制/粘贴到文件夹中的? 你如何使它可以编译? 请和我一起走下台阶。

  1. 在哪里把.h文件?
  2. 在哪里把.dll文件?
  3. 如何编译?

谢谢。

(我试图使用的库是libpng,我在MinGW的窗口中,而且我正在像通常一样从命令行进行编译。)

(从我收集的内容中,将.h文件放在目录A中,将.dll文件放在目录B中,并且可以使用-l和-L编译器选项告诉编译器在哪里find它们,这是正确的吗?)

在Windows下执行(假设你使用Visual Studio)

  • 在解包之后,将库include目录添加到项目的设置(项目 – >属性 – > C / C ++ – >其他包含目录)

  • 对图书馆目录(Project – > Properties – > Linker – > Additional Library Directories)做同样的事情

  • 在链接器输入中指定库的名称:项目 – >属性 – >链接器 – >输入 – >附加依赖项

这之后有希望编译。

我不建议将上面的目录添加到Visual Studio中的全局设置(工具 – >选项 – >项目和解决方案),因为它会创建和编译您的计算机上的东西,而不是编译另一个。

现在,困难的方法是,基于Makefile的构建系统:

  • 解压你的东西
  • 在-I g ++标志下指定include目录
  • 指定-L g ++标志下的库目录
  • 指定要使用的库如下所示:-llibrary name(例如:-lxml2用于libxml2.so)
  • 指定静态库,如:library name.a

最后,你应该有一个丑陋的命令,看起来像:

g ++ -I / work / my_library / include -L / work / my_library / lib -lmylib my_static.a -o appname_exe MYFILE.CPP

(上面的行不是真的只是一个普遍的想法)

我建议去,从某处抓住一个模板的生成文件,并添加所有的东西。

下面是编译和构建基本C工程时会发生什么的简要指南:

  • 第一阶段编译你所有的源文件 – 这将把你写的源文件转换成所谓的目标文件 。 在这个阶段,编译器需要知道你在代码中使用的所有函数的声明,即使是在外部库中,所以你需要使用#include包含你使用的任何库的头文件。 这也意味着你需要告诉编译器这些头文件的位置。 使用GCC,您可以使用-I命令行输入要搜索头文件的目录。

  • 下一个阶段是将所有的目标文件链接成一个可执行文件。 在这个阶段,链接器需要解析对外部库的调用。 这意味着你需要对象形式的库。 大多数图书馆会给你提供如何生成这些信息的指示,或者可以提供已经建好的信息 在Linux下,库文件通常是.a.so文件,但它可能只是一个.o 。 再次,您可以将库的目标文件的位置通过-L选项提供给GCC。

因此你的命令行看起来像这样:

 gcc myProg.c -I/path/to/libpng/include -L/path/to/libpng/lib -lpng -o myProg.exe 

(请注意,当使用-l命令行时,GCC会自动将lib添加到库的起始位置,因此-lpng会导致libpng.a被链接到。)

希望有所帮助。

你必须链接一个.lib或类似的东西,即将“.lib”添加到链接器读取的库中。 至少在Linux下它是如何工作的…还有很长一段时间没有完成Windows。

“.lib”包含.dll共享库中的数据/函数的符号。

这取决于图书馆。 例如,一些库包含预编译的二进制文件(例如dll)和其他你需要自己编译的文件。 你最好看看图书馆的文件。

基本上, 编译你应该:

(1)在编译器的include路径中包含库(include)(.h)文件位置,

(2)在链接器的库路径中有库存根(.lib)位置,并让链接器引用相关的库文件。

为了运行这个程序,你需要有加载器可以看到的共享库(dll),例如在你的system32目录下。

有两种库:静态和动态(或共享)。

静态库采用对象格式,并将它们直接链接到应用程序中。

共享库或动态库驻留在运行应用程序时必须存在的单独文件(.dll或.so)中。 他们还带有必须链接到您的应用程序的目标文件,但在这种情况下,它们只包含找到并调用运行时二进制文件(.dll或.so)的存根。

无论哪种情况,您都必须有一些包含库函数签名(声明)的头文件,否则您的代码将无法编译。

一些“图书馆”只是标题而已,您只需要包含它们即可。 一些由头文件和源文件组成。 在这种情况下,您应该像编写源文件一样编译和链接源应用程序。

当你编译时,假设你的库和头文件和你正在编译的源文件在同一个文件夹中,你需要添加到你的编译行-L . -I . -lpng -L . -I . -lpng -L . -I . -lpng 。 -L告诉链接器在哪里查找库, – 我告诉编译器在哪里查找头文件,-lpng告诉链接器与png库链接。

[编辑]正常的项目会有某种层次结构,头文件位于/include文件夹,第三方库位于/libs文件夹中。 在这种情况下,你会把-I ./include-L ./libs代替-I .-L.

[编辑2]大多数项目使用makefile为了从命令行编译。 你只能手动编译一小部分文件,之后会变得很忙碌

也,
您可能需要查看各种语言和各种平台上的动态加载支持。
这种支持在需要使用库的情况下非常方便,并且您不希望程序在库不可用的情况下失败。