您实际上是如何使用C库的?
我相信这个问题已经被问过很多次了,但我想不出来。请容忍我 所以,当你下载一个库时,你会得到一堆.c和.h文件,还有很多其他的东西。现在假设你想用这个库写一个程序 我将所有的.h文件复制到我的项目目录中。它就是不编译 很好,然后我把库作为一堆.dll,然后我把dll复制到我的项目目录中。仍然没有编译 这是怎么回事 在为项目创建文件夹之后,您会做什么?您将库包的哪些部分复制/粘贴到文件夹中?如何使它能够编译?请和我一起走这些步骤您实际上是如何使用C库的?,c,windows,linker,compilation,C,Windows,Linker,Compilation,我相信这个问题已经被问过很多次了,但我想不出来。请容忍我 所以,当你下载一个库时,你会得到一堆.c和.h文件,还有很多其他的东西。现在假设你想用这个库写一个程序 我将所有的.h文件复制到我的项目目录中。它就是不编译 很好,然后我把库作为一堆.dll,然后我把dll复制到我的项目目录中。仍然没有编译 这是怎么回事 在为项目创建文件夹之后,您会做什么?您将库包的哪些部分复制/粘贴到文件夹中?如何使它能够编译?请和我一起走这些步骤 把.h文件放在哪里 把.dll文件放在哪里 如何编译 谢谢 (我尝试使
(根据我收集的信息,您将.h文件放在目录A中,将.dll文件放在目录B中,您可以使用-l和-l编译器选项告诉编译器在哪里可以找到它们,对吗?您必须链接到.lib或类似的东西,即将“.lib”添加到链接器读取的库中。至少它在Linux下是这样工作的。。。很长时间没有使用Windows了 “.lib”包含指向.dll共享库中的数据/函数的符号 在windows下进行(假设您使用Visual Studio)
- 解包后,将库包含目录添加到项目的设置中(项目->属性->C/C++->其他包含目录)
- 对库目录执行相同的操作(项目->属性->链接器->其他库目录)
- 在链接器输入中指定库的名称:项目->属性->链接器->输入->其他依赖项
- 打开你的东西
- 在-ig++标志下指定include目录
- 在-L g++标志下指定库目录
- 指定要使用的库,如:-llibrary name(例如:-lxml2 for libxml2.so)
- 指定静态库,如:库名称.a
我建议你去,从某处抓取一个模板生成文件,然后添加你所有的东西。当你编译时,假设你的libs和header与你正在编译的源代码在同一个文件夹中,你需要添加到你的编译行
-L-我-lpng
-L告诉链接器在哪里查找库,-I告诉编译器在哪里查找头,-lpng告诉链接器链接到png库
[编辑]
普通项目将具有某种层次结构,其中标题位于/include
文件夹中,第三方lib位于/libs
文件夹中。在本例中,您将放置-I./include
和-L./libs
,而不是-I.
和-L.
[Edit2]大多数项目使用makefile从命令行进行编译。您只能手动编译少量文件,之后会变得非常繁忙,这取决于库。例如,某些库包含预编译的二进制文件(例如DLL),而其他库则需要您自己编译。你最好看看图书馆的文档 基本上,要编译,您应该: (1) 使库的include(.h)文件位置位于编译器的include路径中 (2) 在链接器的库路径中具有库存根(.lib)位置,并使链接器引用相关库文件
为了运行程序,您需要有加载程序可以看到的共享库(DLL),例如在system32目录中。有两种库:静态库和动态库(或共享库) 静态库以对象格式提供,您可以将它们直接链接到应用程序中 共享库或动态库驻留在一个单独的文件(.dll或.so)中,该文件必须在应用程序运行时存在。它们还附带您必须针对应用程序链接的对象文件,但在本例中,它们只包含查找和调用运行时二进制文件(即.dll或.so)的存根 在任何一种情况下,都必须有一些头文件包含库函数的签名(声明),否则代码将无法编译
有些“库”只是标题,您只需要包含它们。有些由头文件和源文件组成。在这种情况下,您应该针对您的应用程序编译和链接源代码,就像您编写的源代码文件一样。以下是编译和构建基本C项目时的简要指南:
- 第一阶段编译所有源文件-这将获取您编写的源文件并将其转换为所谓的对象文件。在此阶段,编译器需要知道在代码中使用的所有函数的声明,即使在外部库中也是如此,因此需要使用
来包含所使用库的头文件这也意味着您需要告诉编译器这些头文件的位置。使用y#include
gcc myProg.c -I/path/to/libpng/include -L/path/to/libpng/lib -lpng -o myProg.exe