2017-10-20 100 views
1

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

我遵循CodeLite's tutorial中的说明,根据这些说明,这应该是可行的,并将项目类型从可执行文件更改为静态库。

运行项目(CTRL + F5命令)后,我期望在/Debug文件夹中找到一个.a文件,可以与可执行文件一起使用,也可以代替可执行文件。但我所能找到的只是可执行文件和一些.o.o.d文件。当我将项目设置为可执行文件时,我也一样。

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

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

+0

我建议开始学习cmake。它可以帮助你解决多个问题,并且如果正确写入,它将简化用户的生活。 – Incomputable

+0

@Incomputable,谢谢你不是第一个。但我不是一个软件开发人员,非常喜欢IDE和他们带来的简化。我确信有一种简单的方法可以配置CodeLite来为我做这件事,但我根本无法找到它。 – raggot

回答

2

正如你可能已经发现,CodeLite允许你从设置更改下拉菜单中 项目的类型 - >一般 - >项目类型

但是,这样做并不会更改项目目标的名称。所以,如果 你开始把你的项目作为一个可执行myprog - 从中​​,也就是说, 调试版本产生./Debug/myprog的项目文件夹下 - 那么 您更改项目类型静态库并重建它,调试 版本将仍然生成./Debug/myprog,但该文件实际上现在实际上是 是一个静态库,缺少通用的lib -prefix和.a扩展名。

为了让输出文件的常规静态库的名字 - libmyprog.a - 你需要重新回到设置 - >一般和 变化输出从文件:

$(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的简单的方法是创建一个项目为此目的并在新建项目向导 选择图书馆 - >静态库作为项目类型而不是某种 的可执行文件。

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

+0

谢谢,尤其是额外的提示!我遵循你的建议,实际上创建了一个单独的项目,其中包含我想要在静态库中组装在一起的所有源文件。你的回答是令人愉快的周一上午的惊喜。 – raggot