如何使用 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
然后重建项目,它会输出一个是静态的目标
图书馆 和 看起来像一个。
当然,您必须对两个项目设置进行相同的更改
Debug 和 Release 配置,如果你想让它们都产生
具有相同文件类型和文件名的目标。
不过...
如果这种程序工程转静态库工程的方式不
看起来很光滑,那可能是因为它是一个很少用的转换。
转换后生成的静态库将包含完全相同的对象
构建程序的文件,包括定义的目标文件
原程序的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 作为项目类型而不是某种类型
可执行文件。
然后只需将新的或现有的源文件添加到静态库项目
直到它包含您希望库使用的所有函数的定义
提供。构建、测试、调试、编辑...直到完成。
我想用我为 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
然后重建项目,它会输出一个是静态的目标 图书馆 和 看起来像一个。
当然,您必须对两个项目设置进行相同的更改 Debug 和 Release 配置,如果你想让它们都产生 具有相同文件类型和文件名的目标。
不过...
如果这种程序工程转静态库工程的方式不 看起来很光滑,那可能是因为它是一个很少用的转换。
转换后生成的静态库将包含完全相同的对象
构建程序的文件,包括定义的目标文件
原程序的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 作为项目类型而不是某种类型 可执行文件。
然后只需将新的或现有的源文件添加到静态库项目 直到它包含您希望库使用的所有函数的定义 提供。构建、测试、调试、编辑...直到完成。