如何使用带有头文件和.so文件的库?

时间:2015-07-02 06:09:04

标签: c++ c

我是C的新手,想要使用图书馆(MLT Multimedia Framework

我已经构建了它并生成了以下目录:include lib share

lib内,有.so .a .la个文件 在include内,有.h个文件

现在,我已经指示这样做:

位于#include <framework/mlt.h>

内的

include/mlt/framework/

问题:

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

3 个答案:

答案 0 :(得分:14)

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

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

回答您的其他问题:

  

在哪里放置我自己的文件以及如何编译它?

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

关于编译的第二个问题,也有不同的方法。如果只有一个或两个源文件,您可以使用编译器前端(例如gcc)来编译和链接并一次性生成可执行文件:

$ gcc -Wall -g source1.c source2.c -o your_program_name

上述命令接受两个源文件,编译并将它们链接到程序your_program_name

如果您需要使用库,则需要在上述命令行中添加一两件事:

  1. 您需要告诉链接器链接到库,这可以通过以下方式完成: -l(小写L)选项:

    $ gcc -Wall -g source1.c source2.c -o your_program_name -lthe_library
    

    重要的是要注意the_library是库的基本名称。如果库文件名为libthe_library.so,则只需要the_library部分,链接器将自动添加其他部分。

  2. 如果库不在标准位置,那么您需要告诉编译器和链接器库文件的位置。这是通过-I(大写i)选项来告诉preprocessor头文件所在的位置,以及链接器文件所在的-L(大写l)。

    这样的东西
    $ gcc -Wall -g -Ilocation/of/headers source1.c source2.c -o your_program_name -Llocation/of/libraries -lthe_library
    
  3. 如果您有多个源文件,则通常使用所谓的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程序将处理依赖关系,这样如果一个源文件自上次构建后未被修改,那么它不会被编译。当只修改了一个或几个源文件时,最后一点将使包含许多源文件的大型项目更快地构建。

      

    如何详细了解主题[...]

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

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

答案 1 :(得分:4)

  

为什么我需要放置仅包含函数原型的头文件?

以满足您的编译器声明这些函数或声明类。由于C ++是静态类型检查语言,因此它们必须知道它们将使用的对象类型。

  

在哪里放置我自己的文件以及如何编译它?

您可以将代码放在文件系统中的任何位置;只有确保在编译时包含路径和lib中的.h文件。通常你需要修改你的路径。

您可以查看有关此链接的构建信息:

https://en.wikipedia.org/wiki/GNU_build_system

答案 2 :(得分:0)

检查代码附带的README文件。它应该告诉你如何正确地将它安装到系统中。通常有一个install构建目标,它将生成的文件安装到正确的目录中。

构建和安装大多数产品的常用命令序列是:

$ ./configure
$ make
$ sudo make install