【发布时间】:2017-12-15 13:38:10
【问题描述】:
我正在处理一个测试项目,我们称之为mytest,它有一个.cpp 和一个.h 文件,内容并不重要——想象一下它包含一些简单的hello_world() 类型函数。 .
所以,我正在制作一个通用的 makefile 来将其编译到各种库输出中,其中我的输出文件夹中的 ls -l 给出:
libmytest.a
libmytest.so -> libmytest.so.1.0
libmytest.so.1 -> libmytest.so.1.0
libmytest.so.1.0
到目前为止一切顺利,我的共享/静态库已创建。
现在我的 make 文件中有一个 make install 目标,它基本上将标头复制到 /usr/local/include 并将所有这些库文件复制到 /usr/local/lib
然后我制作了另一个名为 usertest.cpp 的测试 cpp 文件(对不起,不是很有想象力/描述性的名称),它链接到库文件。
我以各种方式编译:
g++ -Wall -Werror -I. -lmytestg++ -Wall -Werror -I. -lmytest -static
然后我删除了 libmytest.so* 文件,所以我只有 /usr/local/lib 中的 libmytest.a 库文件然后我做了同样的测试:
g++ -Wall -Werror -I. -lmytestg++ -Wall -Werror -I. -lmytest -static
最后我删除了 libmytest.a 文件并复制了 .so 文件所以我只有 /usr/local/lib 中的 libmytest.so* 库文件然后我做了同样的测试:
g++ -Wall -Werror -I. -lmytestg++ -Wall -Werror -I. -lmytest -static
文件大小结果(以字节为单位)为:
1. 7736 - Makes sense, all libs dynamically linked
2. 19674488 - Makes sense, all libs statically linked
3. 64908 - hmm... not really sure why
4. 19674488 - Makes sense, same as 2.
5. 7736 - Makes sense, same as 1.
6. failed - Makes sense, no .so files!
我有三个文件大小,小的(7736)是完全动态链接的。大的是静态链接的....这个中号(64908)是什么?所以我有问题:
- 对于 1. 我假设系统首先查找 .so 库,然后查找 .a 库?
- 对于 3. 这里发生了什么? - 它是否动态链接系统库,但是当它看到我的 .a 库时,它会动态链接它?
注意所有输出都运行良好并调用库中的函数。
【问题讨论】:
-
也许是为什么 5 个链接更有趣 - 你已经删除了所有的库,但它仍然可以工作
-
@UKMonkey 啊,不-我可能没有解释得那么好....我的意思是我删除了 .a 文件和
put back.so 文件....我会重新措辞那一点……
标签: c++ shared-libraries static-libraries lib