我在测试项目上进行了一些实验,我们称之为 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文件(对于命名不是非常具有想象力/描述性,请见谅),它链接到库文件。
我以各种方式编译:
1. g++ -Wall -Werror -I. -lmytest 2. g++ -Wall -Werror -I. -lmytest -static
然后我删除了libmytest.so*文件,所以我只在“/usr/local/lib”中有libmytest.a库文件。然后我做了同样的测试:
3. g++ -Wall -Werror -I. -lmytest 4. g++ -Wall -Werror -I. -lmytest -static
最后,我删除了libmytest.a文件,并“复制回.so文件”,所以我只有libmytest.so*库文件在“/usr/local/lib”中。然后我做了同样的测试:
5. g++ -Wall -Werror -I. -lmytest 6. g++ -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库并动态链接了它?
放回
了 .so 文件....我会重新措辞的.... - code_fodder