【问题标题】:How to convert multiple source files into one .a file如何将多个源文件转换为一个 .a 文件
【发布时间】:2011-09-04 06:08:31
【问题描述】:

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

【问题讨论】:

  • 可能正在重新编译源代码。

标签: c++ codeblocks .lib .a


【解决方案1】:

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

如果你的 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] 替换为库的名称。这是将出现在 Code::Blocks 中的 Link Libraries 对话框中的名称。 Files 可以是你之前创建的目标文件的名称(a.o,b.o,c.o),或者如果目录中没有不相关的目标文件,你可以放入*.o

这应该会导致在目录中创建存档文件。您现在可以将它放在正确的目录中(可能是 /include 的姊妹目录,称为 /lib),并将该目录添加到您的 Code::Blocks 配置中,在链接器搜索目录下。然后,您必须记住为您的项目实际添加库。

【讨论】:

    【解决方案2】:

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

    gcc b.c a.lib
    

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

    【讨论】:

    • 好的...这是我需要的确切代码还是假设是库的名称?因为我收到错误说该代码中的目录不存在...
    • 不,您需要添加 您的 库!有一个文件选择器对话框可以让你这样做!
    • 好吧,你是说我只需要将我需要的 .lib 文件添加到链接器设置中:|... 因为我已经将它们链接了很多次,但它没有用,但是当我得到一个.a 文件立即生效...
    【解决方案3】:

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

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

    您没有在问题中真正指定您正在使用哪种表格。如果您要执行第二种形式,则必须按照 Persson 的建议将 gcc 下的源代码构建为静态库,因为 msvc 工具使用的库格式不兼容。

    不过,如果您使用的是第一个表单,那么有一些好消息。 gcc 的 MinGW 端口应该能够与使用 msvc 开发工具创建的 coff 格式导入库透明地工作。您可以做的只是将 *.lib 导入重命名为 lib*.a 并将其传递给链接器,就像它是任何其他 *.a 文件一样。链接器应该能够整理出它的真实格式。

    我已经在 tdm-gcc-4.5.2 下使用最新的夜间构建的代码块对此进行了测试,它似乎工作正常。

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

    如果有一个现有的 msvc 项目,您可以将其作为起点,将其导入代码块。它将位于 File->Import Project->Visual Studio 等下。

    如果没有可用的,从头开始创建一个新的 C::B 项目并不太难。只需转到 File->New->Project 选择“Static Library”作为项目类型,然后添加所需的任何源文件。如果该库是用半便携的方式编写的,它应该可以轻松编译。

    【讨论】:

    • 嘿...看来我正在使用第二种形式...我有源代码我将如何将其归档?
    • @phan 如果有一个现有的 msvc 项目,您可以将其作为起点,将其导入代码块。它将在 File->Import Project->Visual Studio 等下。如果没有可用的,从头开始创建一个新的 C::B 项目并不太难。只需转到文件->新建->项目选择“静态库”作为类型,然后添加所需的任何源文件。如果库是用半便携的方式编写的,它应该可以轻松编译。如果您需要更多详细信息,只需发布​​您遇到的问题,我会根据需要更新我的答案。
    • Victor..如果您可以将上述评论添加到您的答案中,那就太好了。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2020-11-24
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多