如何将多个源文件转换为一个.a文件

How to convert multiple source files into one .a file

本文关键字:一个 文件 转换 源文件      更新时间:2023-10-16

我刚刚发现代码块(和MingW编译器)只接受.a库文件,而不是.lib将.lib转换为.a文件的最简单方法是什么。。。任何教程等都将不胜感激。编辑让我稍微修改一下我的问题,如何将多个源文件转换为一个归档文件。

要回答具体问题,如何将多个源文件转换为一个存档文件进行静态链接;这是一个两步操作。必须首先将源文件编译为对象文件,然后将对象文件转换为归档文件。

如果你的MinGW安装有MSYS,我建议你使用它。如果没有,您仍然可以使用Windows的命令提示符cmd.exe.

确保您的MinGW/bin目录是PATH环境变量的一部分,这样您就可以从任何地方调用编译器。

从命令行中,移动到保存源代码的目录中。从那里输入命令

mingw32-gcc -O2 -c [files] -I[header directory]

您应该将[files]具体命名为-c a.cpp b.cpp c.cpp,或者您可以用*.cpp来标识它们。[header directory]是源的.h文件相对于您的位置。通常,源文件本身位于一个名为/src的目录中,头文件位于一个称为/include的姐妹目录中。您可以将该目录称为-I../include。如果头文件位于/src目录中名为/include的目录中,那么它将是-Iinclude

生成.o文件后,键入命令

ar rcs lib[something].a [files]

[something]替换为库的名称。这是将出现在"代码::块"中的"链接库"对话框中的名称。Files是您之前创建的对象文件的名称(a.o、b.o、c.o),或者,如果目录中没有不相关的对象文件,您可以将其放入*.o中。

这将导致在目录中创建归档文件。现在,您可以将其放置在适当的目录中(可能是/include的姊妹目录,名为/lib),并将该目录添加到Linker Search Directories下的Code::Blocks配置中。然后,您必须记住为您的项目实际添加库。

MinGW可以使用.LIB文件。以下链接指向使用MS编译器创建的.LIB:

gcc b.c a.lib

在代码块中,在对话框Project|Build Options...中添加库,然后转到Linker Setting的选项卡并添加到Link Libraries框中。

.lib(和.a)在两种不同的能力下工作:

  • 作为程序所依赖的共享Dll的导入库
  • 作为从一个或多个从源代码编译的对象文件创建的存档库

你在问题中没有具体说明你使用的是哪种表格。如果你想做第二种形式,你必须按照Persson的建议,将gcc下的源代码构建为静态库,因为msvc工具使用的库格式不兼容。

然而,如果你使用的是第一种形式,也有一些好消息。gcc的MinGW端口应该能够透明地使用msvc开发工具创建的coff格式导入库。您可以简单地将*.lib导入重命名为lib*.a,并将其传递给链接器,就像它是任何其他*.a文件一样。链接器应该能够对其真实格式进行排序。

我已经在tdm-gcc-4.5.2下用最新的夜间代码块构建测试了这一点,它似乎工作正常

编辑:合并我的评论作为答案的一部分。如果您使用的是第二种形式,并且需要从源代码构建一个静态库,步骤大致如下:

如果有一个现有的msvc项目,您可以通过将其导入代码块来将其作为起点。它将在文件->导入项目->Visual Studio等下。

如果没有可用的,从头开始制作一个新的C::B项目并不太困难。只需转到文件->新建->项目选择"静态库"作为项目类型,然后添加所需的任何源文件。如果这个库是用半可移植的东西编写的,那么编译起来应该不会有太多麻烦。

相关文章: