链接库以创建静态库

时间:2012-09-02 11:32:45

标签: c++ linux g++ ar

我在Lib_file.h和Lib_file.cpp中编写了一些代码。我希望将此代码转换为静态库。我能够编译代码(使用命令g++ -I <necessary include files> -o Lib_file.o Lib_file.cpp)来获取Lib_file.o。我也可以使用ar rvs Lib_file.a Lib_file.o命令将其添加到存档中。现在,当我尝试使用-L选项在其他代码中使用此库时,我得到未定义的引用错误。这个错误指向我的Lib_file.o中的代码。所以我的问题是如何让我的Lib_file.cpp中的代码链接到它使用的库。

到目前为止,我尝试了以下选项

予。创建Lib_file.o后,我尝试了以下命令 g++ -L<include path> -l<.a files> Lib_file.o。执行此命令时,出现以下错误

/usr/lib/../lib64/crt1.o: In function `_start':
init.c:(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

II。我尝试使用ar命令将所有必需的.a文件与我的Lib_file.o一起包含在新存档中。当我尝试将Lib_file.a库与我的应用程序

一起使用时,我仍然得到未定义的引用错误

请帮帮我

1 个答案:

答案 0 :(得分:4)

首先,所有库的名称通常都是libxyz.a,其中xyz是库的名称。

其次,您尝试仅使用用于库的目标文件创建程序,并将其与自身链接。这当然行不通,因为该库没有正常程序所需的main功能。您必须创建另一个程序,并将那个与库链接。

gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz

正如您在上面的命令行中所看到的,我将库最后放在命令行上。这是必需的,因为链接器以相反的顺序寻找依赖关系。

编辑:将静态库与其他库链接:您没有。静态库是完全独立的,如果它需要其他库本身才能工作,那么在编译实际程序时它们必须出现在命令行中。

例如,假设库xyz依赖于标准数学库(即m库)。创建xyz库时不能“链接”它,因为实际上链接静态库,只需将一组目标文件放在一个存档中({{ 1}}和ar扩展名用于存档)。当您构建需要.a库的实际应用程序时,您还需要链接xyz所需的任何库:

xyz