如何从头文件和源文件创建一个C库(用于Ubuntu)?

时间:2012-02-12 19:49:06

标签: c ubuntu

我正在寻找一个基于具有以下结构的.h文件和.c文件来创建C库(即将文件链接并编译成一个文件)的程序(它是一个FEC库:www.openfec.org)。我正在使用Ubuntu。我希望它在不手动指定每个文件的情况下执行此操作。我尝试了WAF,但得到了错误'错误:root:错误:没有名为cflags的模块'。

这是(部分)结构:

fec
 lib_advanced
 ldpc_from_file
   of_code_profile.h
   of_ldpc_ff.h
   ...
 lib_common
   linear_binary_codes_utils
       binary_matrix
       it_decoding
       ml_decoding    

   statistics
   of_cb.h
   of_debug.h
   of_mem.c
   of_mem.h
   of_openfec_api.c
   of_openfec_api.h
   of_openfec_profile.h
   of_types.h       

谢谢!

2 个答案:

答案 0 :(得分:1)

您必须使用gcc将C文件编译为对象文件。

然后你必须使用ar r然后ranlib将对象打包成一个.a库文件。

答案 1 :(得分:1)

*nix系统上的C库(包括所有Linux发行版)都是使用标准工具创建的,这些工具是a)C编译器b)链接器b)ar实用程序c)ranlib实用程序。

C编译器99.9%的时间是GNU C编译器,而链接器ld和实用程序arranlib是gnu系统上的binutils包的一部分(99.9%的linux系统) )。

arranlib用于创建静态库,将已编译的目标文件(* .o文件)放入存档文件libsomething.a中,并使用ranlib对存档编制索引。

可以在gcc编译器中调用链接器来创建具有位置无关代码的动态库,同样已经编译的文件在特殊文件上存档,该文件具有共享对象的.so扩展名。

静态库用于速度和自包含,它们生成大型可执行文件,其中包含最终可执行文件中的所有依赖项。如果有许多更改的库,要更新它,您将不得不重新编译所有内容。

动态库分别编译和链接可执行文件,它们可以由多个可执行文件同时使用,如果更新了一个库,则只需要重新编译单个库,而不是每个依赖于它的可执行文件。

这些工具的使用是通用的标准程序,它们可能因* nix系统到* nix系统的细节而有所不同,但在linux上你基本上总是使用GCC和Binutils软件包。 make,cmake,autotools等形式的额外构建实用程序可用于帮助完成该过程,但始终使用基本工具。

通常在最基本的级别上编写Makefile脚本,该脚本由make实用程序解释。根据您的命令,它可以创建一种或两种类型的库,安装库和可执行文件,卸载它们,清理等等。

了解更多信息:

http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
http://www.dwheeler.com/program-library/Program-Library-HOWTO/