昨天夜里某 bbs 上进行了一场关于 gcc 链接库的讨论,结果最后转移到了 Windows 下面 VC8 msvcr80.dll 的话题。。

事情的起因是这样的:

我想对某程序静态链接 libstdc++ ,但是动态链接  libc,  因为这个程序用到了 dlopen , 而 dlopen 是无法静态链接的。于是我问如何在 configure.in 里面找到 libstdc++.a 的具体路径,好加在 LDADD 里面

首先是 westline 师弟给出的解决方案 gcc -print-file-name=libstdc++.a , man 了一下,原来 gcc 还提供了一坨类似的函数,用来把他知道的都告诉你。

接下来话题就变成了为啥需要静态链接 libstdc++ 了,我其实就是想避免 libstdc++.so.5 和 libstdc++.so.6 的问题
但是这时侯伟大的 kirbyzhou 爷现身了

发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Mon Dec 5 23:36:11 2005), 转信

主要是 c++需要知道 class 的实现细节内容,主要是指对象的大小。
不然 C++的.so 接口定下来也不是什么难事。

【 在 COMMAN ( ) 的大作中提到: 】
【 在 Kittyboy (Oyahoe) 的大作中提到: 】
: ……
: configure 的时候定位出 libstdc++.a 的路径应该是可以的,makefile 里面有那个路径,
就是 configure 出来那个 gcc 的 lib 吧。。
: 不过静态 libstdc++并且动态 libc 这个要求也特别了一点。。
这个是想尽量减少依赖性呀,FC2 上面是 libstdc++.so.5 , FC3 上面就是 libstdc++.s
o.6 了,太变态了,libc 倒是从 redhat ?.? 的时候开始已经是 libc.so.6 了。RH 9 开
始里面的名称也都是 GLIBC2.3 了

接下来大家开始讨论 Windows 下面把  MSVCR71.DLL 的符号都给 forward 到 MSVCRT.DLL ,以减少程序依赖性的问题。

kirby 爷还是一如既往的拍砖。

发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:11:24 2005), 转信

【 在 boost (我是一棵无聊) 的大作中提到: 】
什么意思?缺的那些 symbol?还是说名字一样过去也不去?
1.缺 symbol,比如一些检查 stack 的内部小函数。
2.bootstrap 不一样

【 在 COMMAN ( ) 的大作中提到: 】

: 但是 MSVCRT.dll 基本可以肯定不能支持 MSVCR71 的那些函数吧。我严重怀疑 forwar
d 过去了也是一调用就崩。

发信人: kirbyzhou (世界太小 梦想太大), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:35:30 2005), 转信

1.exception/type*info 及其子类的 size 不兼容问题
2.swprintf 以及一系列和 wchar_t*有关的东西
3.*_set_buffer_overrun_handler 等一系列
【 在 COMMAN ( ) 的大作中提到: 】
admire 爷,看来您已经研究过缺 symbol 的函数名了,给个列表吧。
【 在 kirbyzhou (世界太小 梦想太大) 的大作中提到: 】
: 1.缺 symbol,比如一些检查 stack 的内部小函数。
: 2.bootstrap 不一样

然后下来开始关于 manifest 的讨论。起因是大家开始讨论 VC8 的 msvcr80.dll 的安装问题,kirby 说这个一定要带 manifest, 否则根本不能用。我觉得不是这样的,不过我还没有做试验证明

发信人: COMMAN ( ), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:41:47 2005), 转信

嗯,manifest 是表明了你这个 dll 在什么样的 context 下面 load
然后 xp 支持一组 activatectx 之类函数,程序可以调用设定要用什么 context.
如果非常懒,可以给程序也写一个 manifest, 这样 xp 的 loader 会帮你做这个事情
两者加一起就可以自动动态挂接编译者想要的 dll 版本了。不会造成 dll 版本冲突。
assembly 同理。

所以我总觉得这个不是必须的,如果没有大不了 fallback 到 system32 下面去 load 嘛

【 在 boost (我是一棵无聊) 的大作中提到: 】
我土鳖地问一句,manifest 是不是就是包了一个依赖的 crt dll 的 assembly 名字,
用来在 winsxs 目录下找 dll?
【 在 COMMAN ( ) 的大作中提到: 】
: 可能是,我刷个牙回来还没有拍出来,不过我还是觉得 manifest 不是必须的,跟 wins
xs 下面那些冲突就冲突了,基本造成问题的可能性微乎其微,只要 microsoft 这个 dll
的向下兼容性还能够保持就行。

本来话题发展到这里,已经跑题很远了,但是 zeel 爷出现了,并且给出了这个话题开始的最标准答案
为这个讨论划上了完美的句号。

发信人: zeel (我爱我老婆), 信区:
标 题: Re: 问个土问题
发信站: (Tue Dec 6 00:25:03 2005), 转信

发信人: Valentin Nechayev <netch @segfault.kiev.ua>, 信区: Unix
标 题: Re: Linking with different static and dynamic library
发信站: Dark side of coredump (Tue Mar 11 20:15:23 2003)
转信站: SMTH!maily.cic.tsinghua.edu.cn!news.happynet.org!news.cn99.com!newsfeed
出 处: news.lucky.net

Kenji Chan wrote:

KC> Here I’ve got a “program” which links to two library lib_a and lib_b
KC> when I use –static for g++, it links all library statically
KC> But how can I do this:
KC> program –> statically lib_a.a
KC> also –> dynamically lib_b.so
KC> What command should I type?

If your system uses GNU ld, you may try following:

gcc -o $prog $objs -Wl,-Bstatic -l_a -Wl,-Bdynamic -l_b -Wl,-Bdynamic

last -Wl,-Bdynamic is here to provide mode for system default libraries
(libc, etc.)

(If linker isn’t GNU ld, find details in linker manuals.)