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

How to compile a static library with Codelite 11.0.0?

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

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

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

我尝试关闭并重新打开 CodeLite,但没有帮助。我找不到关于如何使用 CodeLite 构建静态库的任何 official/unofficial 示例。

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

您可能已经发现,CodeLite 允许您更改 设置 -> 常规 -> 项目类型.

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

给输出文件一个常规的静态库名- libmyprog.a - 您需要返回到 设置 -> 常规 和 将 输出文件 更改为:

$(IntermediateDirectory)/$(ProjectName)

至:

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

然后重建项目,它会输出一个静态的目标 图书馆 看起来像一个。

当然,您必须对两个项目设置进行相同的更改 DebugRelease 配置,如果你想让它们都产生 具有相同文件类型和文件名的目标。

不过...

如果这种程序工程转静态库工程的方式不 看起来很光滑,那可能是因为它是一个很少用的转换。

转换后生成的静态库将包含完全相同的对象 构建程序的文件,包括定义的目标文件 原程序的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 函数的定义放入静态成员中 library 是没有意义的,因为如果在另一个成员的链接中需要那个成员 程序然后它的链接将失败。

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

  • 如果你想要的静态库中的任何函数在同一个源中定义 文件为 main,那么您需要将其从该源文件中取出并定义它 是不同的。

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

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

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

假设您已经这样做了,创建静态库的直接方法是 CodeLite 将创建一个项目 为此 并在 新建项目向导 中 选择 Library -> Static Library 作为项目类型而不是某种类型 可执行文件。

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