我确信这个问题已经被问了很多次了,但我无法弄清楚。 忍受着我
所以当你下载一个库时,你会得到一堆.c和.h文件,还有很多其他的东西。 现在说你想用这个库编写一个程序。
我将所有.h文件复制到我的项目目录中。 它只是不编译。
太棒了,所以我把这个库当作一堆.dll文件,然后我把这个dll复制到我的工程目录中。 仍然不编译。
这个怎么用?
你做什么,就像在为你的项目创build文件夹之后一样? 库文件包的哪些部分是复制/粘贴到文件夹中的? 你如何使它可以编译? 请和我一起走下台阶。
谢谢。
(我试图使用的库是libpng,我在MinGW的窗口中,而且我正在像通常一样从命令行进行编译。)
(从我收集的内容中,将.h文件放在目录A中,将.dll文件放在目录B中,并且可以使用-l和-L编译器选项告诉编译器在哪里find它们,这是正确的吗?)
在Windows下执行(假设你使用Visual Studio)
在解包之后,将库include目录添加到项目的设置(项目 – >属性 – > C / C ++ – >其他包含目录)
对图书馆目录(Project – > Properties – > Linker – > Additional Library Directories)做同样的事情
在链接器输入中指定库的名称:项目 – >属性 – >链接器 – >输入 – >附加依赖项
这之后有希望编译。
我不建议将上面的目录添加到Visual Studio中的全局设置(工具 – >选项 – >项目和解决方案),因为它会创建和编译您的计算机上的东西,而不是编译另一个。
现在,困难的方法是,基于Makefile的构建系统:
最后,你应该有一个丑陋的命令,看起来像:
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为了从命令行编译。 你只能手动编译一小部分文件,之后会变得很忙碌
也,
您可能需要查看各种语言和各种平台上的动态加载支持。
这种支持在需要使用库的情况下非常方便,并且您不希望程序在库不可用的情况下失败。