如何使用Codelite 11.0.0编译静态库?

时间:2017-10-20 14:39:03

标签: c++ static-libraries codelite

我想从我为C ++项目编写的所有函数中编译一个静态库。我在Ubuntu 16.04上使用CodeLite 11.0.0,配置为使用GCC作为编译器。

我已按照CodeLite's tutorial中的说明进行操作,根据该说明,这应该是可行的,并将项目类型从可执行文件更改为静态库。

运行项目(CTRL + F5命令)后,我希望在.a文件夹中找到/Debug文件,或者代替可执行文件,或者代替可执行文件。但是,我所能找到的只是可执行文件和一些.o.o.d文件。当项目设置为可执行文件时,我发现了同样的信息。

我试图关闭并重新打开CodeLite,但它没有帮助。我找不到任何有关如何使用CodeLite构建静态库的官方/非官方示例。

有谁知道如何设置CodeLite来生成.a静态库文件?

1 个答案:

答案 0 :(得分:2)

正如您可能已经发现的那样,CodeLite允许您更改a的类型 来自设置 - >的下拉菜单中的项目一般 - > 项目类型

但是,这样做不会更改项目目标的名称。因此,如果 你开始将你的项目作为一个可执行文件myprog - 从中​​开始,比如说 调试构建在项目文件夹下生成./Debug/myprog - 然后 您将项目类型更改为静态库并重建它,即Debug build仍然会生成./Debug/myprog,但实际上该文件将会生成 是一个静态库,缺少习惯lib - 前缀和.a扩展名。

为输出文件提供传统的静态库名称 - libmyprog.a - 您需要返回设置 - &gt; 一般和 从<:p>更改输出文件

$(IntermediateDirectory)/$(ProjectName)

为:

$(IntermediateDirectory)/lib$(ProjectName).a

然后重建项目,它将输出 静态的目标 库看起来像一个。

当然,您必须对两者中的项目设置进行相同的更改 调试发布配置(如果您希望它们都生成) 具有相同文件类型和文件名的目标。

<强>然而...

如果将程序项目转换为静态库项目的方式不行 看起来非常光滑,这可能是因为它是一种很少使用的转换。

转换后生成的静态库将包含完全相同的对象 构建程序的文件,包括定义的目标文件 原始程序的main功能。我们假设该目标文件 是main.o,它定义了链接器可以看到的0个或更多其他函数。

与静态库链接的任何其他程序newprog必须提供 它自己的main函数在不同的目标文件中,所以在任何这样的链接中都有一个 必须要做两件事: -

  • newprog的链接不需要libmyprog.a(main.o)中定义的任何功能, 所以libmyprog.a(main.o)没有关联,也可能不存在。

  • newprog 的链接需要foo中定义的某个函数libmyprog.a(main.o), 所以libmyprog.a(main.o) 相关联;然后以及foo的定义 程序链接main的重复定义 - 它自己的定义加上 libmyprog.a(main.o)中的一个。重复定义是错误,因此链接失败。

将某个程序的main函数的定义放入静态成员中 库是没有意义的,因为如果在另一个链接中需要该成员 程序然后它的联系将失败。

因此,将程序项目转换为静态库项目需要一些 转换前的重构: -

  • 如果在同一来源中定义了静态库中所需的任何功能 文件为main,然后您需要将其从该源文件中取出并进行定义 是一个不同的。

  • 之后,从项目中删除定义main的源文件。

  • 最后,转换并重建项目。

您必须进行重构才能从原始程序源代码中提取 一堆适合构建静态库的源文件。

假设你已经这样做了,用一种简单的方法创建一个静态库 CodeLite是为此目的创建项目 新建项目向导 选择图书馆 - &gt; 静态库作为项目类型而不是某种类型 可执行文件。

然后只需将新的或现有的源文件添加到静态库项目中 直到它包含您希望库所有功能的定义 提供。构建,测试,调试,编辑......直到完成。