Linux 应用程序开发
通常有三个问题需要考虑,分别是:1)在Linux应用开发过程中,不同Linux版本下标准库链接不兼容的问题;2)在制作Linux静态库的过程中,发现它与下一个静态库的制作方法不同;3)当Linux应用程序链接到第三方库或其他静态库时,会发现链接顺序的烦人问题。本文将重点介绍这三个问题,重点介绍 Linux 下标准库的链接以及如何智能构建 (*.a)。
需要了解的两件基本事情
由于大量的Linux
版本及其独立性,Linux应用在工程生产和使用中必须精通以下两点,才能有效工作和理想运行。在
Linux 下,有三种方法可以链接到标准库(完全静态、半静态 (,++)、完全动态)及其各自的优缺点。
如何在 Linux (*.a) 下巧妙地构建,以及如何设置链接选项来解决 gcc 更具体的链接库的顺序问题。
三种标准库链接方法的选项和比较
为了说明最终应用的三种不同标准库链接方法之间的区别,这里使用了一个经典的示例应用,参见清单 1。
清单 1
#
#
使用 std::cout;
使用 std::endl;int
main(int argc, char* argv[])(
“!(由 )\n“);
cout ar.mac
echo END >> ar.macar -
M < ar.mac
ar -q demo.a .o
echo OPEN demo.a > ar.mac
echo xml.a >> ar.mac
echo SAVE >> ar.mac
echo END >> ar.macar
-M < ar.mac
rm ar.mac
如果你想在 Linux 中使用 ar 脚本创建一个静态库,你可以编写清单 3 中所示的代码
清单 3$(如果 $( $@
),@$(RM) $@)$(如果 $(
ar.mac),@$(RM) ar.mac)$(
如果 $( %.a, $^),@
echo $ar.mac
@ echo 保存 >> ar.mac
@ echo echo END >> ar.mac@$(AR) -M < ar.mac $(if $( %.o,$^),@$(
AR) -q $@ $( %.o, $^))$(
如果 $( %.a, $^),
@ echo OPEN $ar.mac
$( LIB, $( %.a, $^),
@ echo $(LIB) >> ar.mac
@ echo 保存 >> ar.mac
@ echo END >> ar.mac
@$(AR) -M < ar.mac
@$(RM) ar.mac
endef (英语)$(
)/$():$(OBJS)
$()
从图 9 中可以看出,以这种方式生成的 demo.a 就是我们想要的。
图 9.巧妙地创建静态库文件结果
Linux静态库链接顺序问题及解决方法:
正如 GCC 手册中提到的:
它使你写这个的地方;
和 和 文件按它们的顺序排列。
因此,'foo.o -lz bar.o ' ' z ' 在文件 ' foo.o ' 之后,但'
bar.o'。如果 'bar.o ' 到 'z' 中,则 可能 不是 。
为了
解决这个库链接顺序问题,我们需要添加一些链接选项:$(CXX) $() $(OBJS) - “-(” $
(LIBS) - “-)” -o $@通过把所有需要链接的静态库
放在-“-(”和-“-)”之间,可以是一个G++链接进程,自动循环所有静态库,从而解决了原有的链接顺序问题。
涉及链接选项:-
-
作为 传递给 .您可以使用它来 -
哪个 GCC 不知道该怎么做.
总结
本文介绍了 Linux 下三个标准库的链接方式及其优缺点,也介绍了 Linux 下静态库的创建和使用,希望能为大多数需要部署 Linux 应用和编写 Linux 的工程师提供有用的帮助。