我想从我为C ++项目编写的所有函数中编译一个静态库。我在Ubuntu 16.04上使用CodeLite 11.0.0,配置为使用GCC作为编译器。
我已按照CodeLite's tutorial中的说明进行操作,根据该说明,这应该是可行的,并将项目类型从可执行文件更改为静态库。
运行项目(CTRL + F5命令)后,我希望在.a
文件夹中找到/Debug
文件,或者代替可执行文件,或者代替可执行文件。但是,我所能找到的只是可执行文件和一些.o
和.o.d
文件。当项目设置为可执行文件时,我发现了同样的信息。
我试图关闭并重新打开CodeLite,但它没有帮助。我找不到任何有关如何使用CodeLite构建静态库的官方/非官方示例。
有谁知道如何设置CodeLite来生成.a
静态库文件?
答案 0 :(得分:2)
正如您可能已经发现的那样,CodeLite允许您更改a的类型 来自设置 - >的下拉菜单中的项目一般 - > 项目类型。
但是,这样做不会更改项目目标的名称。因此,如果
你开始将你的项目作为一个可执行文件myprog
- 从中开始,比如说
调试构建在项目文件夹下生成./Debug/myprog
- 然后
您将项目类型更改为静态库并重建它,即Debug
build仍然会生成./Debug/myprog
,但实际上该文件将会生成
是一个静态库,缺少习惯lib
- 前缀和.a
扩展名。
为输出文件提供传统的静态库名称 -
libmyprog.a
- 您需要返回设置 - > 一般和
从<: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; 静态库作为项目类型而不是某种类型 可执行文件。
然后只需将新的或现有的源文件添加到静态库项目中 直到它包含您希望库所有功能的定义 提供。构建,测试,调试,编辑......直到完成。