c - 可疑的静态链接可执行文件大小

标签 c makefile linker blackberry-10 qnx

我有一个 BB 10/QNX 应用程序,其中我需要使用比 BB 10 上默认版本更新的 SQLite 版本。我想我可以通过将我自己的 SQLite 代码与我的应用程序链接来做到这一点。我意识到在我的 qmake 生成的 Makefile 中,选项 -lsqlite3 被传递给 qcc。在库位置(/opt/bbndk/target_10_2_0_1155/qnx6/armle-v7/usr/lib)中,我找到了以下文件:

size filename
559386 libsqlite3.a
560662 libsqlite3S.a
15 libsqlite3.so -> libsqlite3.so.1
496503 libsqlite3.so.1

我认为我可以用我自己从最新的 sqlite3.c 编译的文件替换 libsqlite3.a (合并)。让我困惑的是,我的应用程序可执行文件的大小只有 180 kB,因此 libsqlite3.a 中的代码似乎不存在于其中。如果 SQLite 是动态链接的,我希望应用程序存档 (.bar) 包含 libsqlite3.so,但这也是不正确的,因为存档只有 130 kB 大。应用程序如何使用 SQLite(通过 Qt 数据库类),但 SQLite 代码从未进入应用程序存档?

最佳答案

静态版本

将可执行文件链接到静态库时,编译器知道您正在构建一个“成品”:没有任何内容取决于您的可执行文件。它允许编译器包含未使用的代码。假设您只使用库中的一个函数,该函数本身没有使用库中的任何其他函数。编译器将仅选择与该特定函数相对应的机器代码,并轻轻地忽略其余部分。

动态版本

关于 bar 存档和动态库的大小,它归结为真正的 bar 存档。它只是一个 zip 存档(可能添加了一些元数据,不知道详细信息)。两种可能性:要么 .so 文件被极大压缩,要么编译器依赖系统库并且没有将其捆绑在 bar 存档中。

关于c - 可疑的静态链接可执行文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26014182/

相关文章:

c++ - pthreads 中的内存模型规范

c++ - 没有OWNER_WRITE的cmake安装目录

命令行参数写入 make 文件

c++ - 如何使用版本名称将二进制文件与库链接

c - 简单的随机数游戏程序

c - 如何使用 fread 从二进制文件中读取整数?

c++ - Ar Drone SDK 中外部 Makefile 的问题

linux -/usr/bin/ld : cannot find -lcurl

macos - 运行 `cc` 时无法执行链接器 "cargo build"错误

c++ - 用C和C++调用的(…)是什么?