【发布时间】:2011-09-04 06:08:31
【问题描述】:
我刚刚发现代码块(和 MingW 编译器)只需要 .a 库文件而不是 .lib 什么是将 .lib 转换为 .a 文件的最简单方法......任何教程等将不胜感激。 编辑 让我稍微修改一下我的问题,如何将众多源文件转换为一个 .a 存档文件。
【问题讨论】:
-
可能正在重新编译源代码。
标签: c++ codeblocks .lib .a
我刚刚发现代码块(和 MingW 编译器)只需要 .a 库文件而不是 .lib 什么是将 .lib 转换为 .a 文件的最简单方法......任何教程等将不胜感激。 编辑 让我稍微修改一下我的问题,如何将众多源文件转换为一个 .a 存档文件。
【问题讨论】:
标签: c++ codeblocks .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] 替换为库的名称。这是将出现在 Code::Blocks 中的 Link Libraries 对话框中的名称。 Files 可以是你之前创建的目标文件的名称(a.o,b.o,c.o),或者如果目录中没有不相关的目标文件,你可以放入*.o。
这应该会导致在目录中创建存档文件。您现在可以将它放在正确的目录中(可能是 /include 的姊妹目录,称为 /lib),并将该目录添加到您的 Code::Blocks 配置中,在链接器搜索目录下。然后,您必须记住为您的项目实际添加库。
【讨论】:
MinGW 可以使用 .LIB 文件。以下链接指向使用 MS 编译器创建的 .LIB:
gcc b.c a.lib
在代码块中,您在Project|Build Options... 对话框中添加库,然后转到Linker Settings 选项卡并添加到Link Libraries 框中。
【讨论】:
.lib(和 .a 也是)在两种不同的能力下工作:
您没有在问题中真正指定您正在使用哪种表格。如果您要执行第二种形式,则必须按照 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”作为项目类型,然后添加所需的任何源文件。如果该库是用半便携的方式编写的,它应该可以轻松编译。
【讨论】: