gpt4 book ai didi

c++ - 如何使用带有标题和 .so 文件的库?

转载 作者:可可西里 更新时间:2023-11-01 15:40:02 24 4
gpt4 key购买 nike

我是 C 新手,想使用一个库 ( MLT Multimedia Framework )

我已经构建了它并生成了以下目录:include lib share
lib.so .a .la文件
include.h文件

现在,我被指示这样做:
#include <framework/mlt.h>里面是include/mlt/framework/
问题:

  • 为什么我需要放置只包含函数原型(prototype)的头文件?那么真正的功能在哪里呢?它们是否以某种方式与 lib 中包含的内容相关联?目录?
  • 在哪里放置我自己的文件和如何编译它 ?
  • 如何了解有关主题的更多信息:
  • 动态/静态库
  • build /制作/安装
  • 如何使用任何 C 库
  • 最佳答案

    如果您没有函数原型(prototype),编译器如何知道库中存在哪些函数?简短的回答是:没有。更长的答案:编译器不关心库文件,静态(以 .a 结尾的文件)或共享(以 .so 结尾的文件),它只关心当前的 translation unit .由链接器来处理解析 undefined reference 。

    使用库时,将包含所需声明(结构、类、类型、函数原型(prototype))的头文件包含到源文件中。源文件加上所有包含的头文件构成了编译器用来生成代码的翻译单元。如果有 undefined reference (例如对库中函数的调用),编译器会向生成的目标文件添加有关它的特殊信息。然后链接器查看所有目标文件,如果找到未解析的引用,它会尝试在其他目标文件和提供的库中找到它。如果所有定义都被解析,链接器生成最终的可执行文件,否则它将未解析的定义报告为错误。

    回答您的其他问题:

    Where to place my own files and how to compile it?



    这是两个问题,第一个问题(关于文件的放置)的答案是这并不重要。对于只有少量源文件和头文件的小项目,通常将所有文件放在一个公共(public)项目目录中。

    第二个问题,关于编译,也有不同的方法。如果只有一两个源文件,您可以使用编译器前端(例如 gcc )一次性编译、链接和生成可执行文件:
    $ gcc -Wall -g source1.c source2.c -o your_program_name

    上述命令取两个源文件,编译并链接到程序 your_program_name .

    如果需要使用库,则需要在上述命令行中添加一两件事:
  • 您需要告诉链接器与库链接,这是通过例如完成的-l (小写 L)选项:
    $ gcc -Wall -g source1.c source2.c -o your_program_name -lthe_library

    需要注意的是the_library是库的基本名称。如果库文件名为 libthe_library.so那么只有the_library部分,链接器会自动添加其他部分。
  • 如果库不在标准位置,则需要告诉编译器和链接器库文件在哪里。这是通过 -I 完成的(capital i) 选项告诉 preprocessor头文件所在的位置,以及 -L (大写 l)链接器文件所在的位置。

    就像是
    $ gcc -Wall -g -Ilocation/of/headers source1.c source2.c -o your_program_name -Llocation/of/libraries -lthe_library

  • 如果您有多个源文件,通常使用所谓的 makefiles它列出了所有源文件、它们的依赖项、编译器和链接器标志,并包含有关如何构建目标文件和链接最终程序的规则。这样的 makefile 看起来像
    CFLAGS  = -Wall -g
    LDFLAGS = -g

    SOURCES = source1.c source2.c
    OBJECTS = $(SOURCES:.c=.o)

    TARGET = your_program_name

    .PHONY: all
    all: $(TARGET)

    $(TARGET): $(OBJECTS)
    $(LD) $(LDFLAGS) $^ -o $@

    %.o: %.c
    $(CC) $(CFLAGS) $< -c -o $@

    上面的 makefile 应该与前面的命令行几乎相同。最大的区别在于添加更多源文件、为特殊文件添加特殊规则要容易得多,最重要的是, make程序将处理依赖关系,因此如果一个源文件自上次构建以来没有被修改,那么它就不会被编译。当只有一个或几个源文件被修改时,最后一点将使具有许多源文件的大型项目构建得更快。

    How to learn more about the topics [...]



    通过访问您最喜欢的搜索引擎,并在那里寻找这些主题。我也推荐例如 Wikipedia .

    当然,如果你使用 Integrated Development Environment (a.k.a. an IDE)那么您就不必从命令行进行编译,也不必制作自己的 makefile,IDE 将为您处理所有这些。它还会有项目设置对话框,您可以在其中输入包含路径和库路径,以及要链接的库。

    关于c++ - 如何使用带有标题和 .so 文件的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31176747/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com