我在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库与我的应用程序
一起使用时,我仍然得到未定义的引用错误请帮帮我
答案 0 :(得分:4)
首先,所有库的名称通常都是libxyz.a
,其中xyz
是库的名称。
其次,您尝试仅使用用于库的目标文件创建程序,并将其与自身链接。这当然行不通,因为该库没有正常程序所需的main
功能。您必须创建另一个程序,并将那个与库链接。
像
gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz
正如您在上面的命令行中所看到的,我将库最后放在命令行上。这是必需的,因为链接器以相反的顺序寻找依赖关系。
编辑:将静态库与其他库链接:您没有。静态库是完全独立的,如果它需要其他库本身才能工作,那么在编译实际程序时它们必须出现在命令行中。
例如,假设库xyz
依赖于标准数学库(即m
库)。创建xyz
库时不能“链接”它,因为实际上链接静态库,只需将一组目标文件放在一个存档中({{ 1}}和ar
扩展名用于存档)。当您构建需要.a
库的实际应用程序时,您还需要链接xyz
所需的任何库:
xyz