博主从事嵌入式Linux上的软件开发,其中用到了很多库。博主发现这些库都是静态链接的。如果有多个程序都要用到这个库,而且这个库又比较大的时候。这将是一个莫大的空间浪费。
博主对比了一下本地编译与交叉编译下的日志输出,发现有以下比较可疑的信息:
上面左边76,77行,不能支持shared libraries。
打开 ./configure,找到对应的输出语句:
能否支持,是由 can_build_shared 这个变量决定的。
而 can_build_shared 在这里有修改:
去 confilg.log 中搜 11262 行的输出结果:
结果可以看出 dynamic_linker 的值是 “GNU/Linux ld.so”,不是 "no",所以不是这里影响了 can_build_shared 变量。
查得另一处影响的变量:
去 config.log 查得 ld_shlibs 的值为 no:
那为什么 ./configure 认为 rsdk-linux-gcc 不支持 shared library 呢?它的判断标准是什么?
博主翻了好几页,这 ./configure 真不是人看的,没有对缩进,而且好深的case嵌套。哎~,脑空量溢出了。
大概可以分析出跟 host 有关系,./configue 在分析是什么系统,根据系统来判断 ld_shlibs 的值。
如果是这样,很可能是我在 Makefile 中:
./configure --host=mips-linux 所致?将 "mips-linux" 改成 "linux" 再试试。
通过打调试信息,得知是在这里设置的 ld_shlibs 为 no 的:
与这个case相关的代码好大,好难看出到底是什么条件了。查得与 host_os 变量相关。
在调试信息中打印 host_os 变量的值,为 "elf" 。为什么是这个?而 host_os 在这里赋值:
从 config.log 中得知 ac_cv_host = mips-unkonwn-elf 。
ac_cv_host 来源:
这个由 config.sub 与 host_alias 所得。而 host_alias 来自于:
可以从 L984 得知,host_alias 来自于我们 ./configure 时传的 --host=mips 所得。
理一下思路:
我们转入了一个 --host=mips-linux,configure 执行 sh config.sub mips-linux,返回的结果是 "mips-unkonwn-elf",host_os 从中提取出 "elf",然后就不对了。
那 --host=?? 得看 config.sub 如何转换。