您实际上是如何使用C库的?

您实际上是如何使用C库的?,c,windows,linker,compilation,C,Windows,Linker,Compilation,我相信这个问题已经被问过很多次了,但我想不出来。请容忍我 所以,当你下载一个库时,你会得到一堆.c和.h文件,还有很多其他的东西。现在假设你想用这个库写一个程序 我将所有的.h文件复制到我的项目目录中。它就是不编译 很好,然后我把库作为一堆.dll,然后我把dll复制到我的项目目录中。仍然没有编译 这是怎么回事 在为项目创建文件夹之后,您会做什么?您将库包的哪些部分复制/粘贴到文件夹中?如何使它能够编译?请和我一起走这些步骤 把.h文件放在哪里 把.dll文件放在哪里 如何编译 谢谢 (我尝试使

我相信这个问题已经被问过很多次了,但我想不出来。请容忍我

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

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

很好,然后我把库作为一堆.dll,然后我把dll复制到我的项目目录中。仍然没有编译

这是怎么回事

在为项目创建文件夹之后,您会做什么?您将库包的哪些部分复制/粘贴到文件夹中?如何使它能够编译?请和我一起走这些步骤

  • 把.h文件放在哪里
  • 把.dll文件放在哪里
  • 如何编译
  • 谢谢

    (我尝试使用的库是libpng,我在windows中使用MinGW,我希望像往常一样从命令行编译。)


    (根据我收集的信息,您将.h文件放在目录A中,将.dll文件放在目录B中,您可以使用-l和-l编译器选项告诉编译器在哪里可以找到它们,对吗?

    您必须链接到.lib或类似的东西,即将“.lib”添加到链接器读取的库中。至少它在Linux下是这样工作的。。。很长时间没有使用Windows了

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

    在windows下进行(假设您使用Visual Studio)

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

    • 对库目录执行相同的操作(项目->属性->链接器->其他库目录)

    • 在链接器输入中指定库的名称:项目->属性->链接器->输入->其他依赖项

    在这之后,我希望应该编译

    我不建议将上面的目录添加到VisualStudio的全局设置(工具->选项->项目和解决方案),因为它将创建一个在您的计算机上编译而不在另一台计算机上编译的环境

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

    • 打开你的东西
    • 在-ig++标志下指定include目录
    • 在-L g++标志下指定库目录
    • 指定要使用的库,如:-llibrary name(例如:-lxml2 for libxml2.so)
    • 指定静态库,如:库名称.a
    最后,您应该有一个丑陋的命令,看起来像:

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

    (上面这一行并不是真正的测试,只是一个大概的想法)


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

    当你编译时,假设你的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项目时的简要指南:

    • 第一阶段编译所有源文件-这将获取您编写的源文件并将其转换为所谓的对象文件。在此阶段,编译器需要知道在代码中使用的所有函数的声明,即使在外部库中也是如此,因此需要使用
      #include
      来包含所使用库的头文件这也意味着您需要告诉编译器这些头文件的位置。使用y
      gcc myProg.c -I/path/to/libpng/include -L/path/to/libpng/lib -lpng -o myProg.exe