linux环境下: 静态连接库,动态连接库, 甚至直接的源代码编译单元的优缺点

redex 2007-11-08 11:58:19
linux环境下: 静态连接库,动态连接库, 甚至直接的源代码编译单元的优缺点

技术层面以及对团队工作(比如分工协作), 有什么具体和实际的优缺点??

请大家来点实际的, 不要一上来就说动态连接库 如何如何好.

不揣浅陋, 先说说我个人体会: 个人接触过的程序规模都不太大, 直接用源代码编译单元
除了标准c库外不用任何第三方静态/动态库, 自己也不写静动态库, 反而觉得挺方便.
...全文
655 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
redex 2007-11-10
  • 打赏
  • 举报
回复
《大规模C++软件设计》确实引出了一个很重要的话题: 物理设计 问题

但这个很具实践价值的话题在很多书上都只是一笔带过, 先仔细研究研究看.
star119119 2007-11-09
  • 打赏
  • 举报
回复
to star119119:
代码直接编译方面: 工程大了,文件涉及到 好几百m 你在看看????

=======================================

可是用makefile的话, 它是只编译那些你改动过的源代码文件啊, 比如你修改了某模块的
20个文件, 它只是编译这20个文件啊, 速度不会很慢吧?? 你不会改一个模块就改几百m内容吧??
==================================================================
是啊,不至于那样。几个文件就几百M。但是,如果你的程序需要更新换代的话。你怎么办?让客户都重新安装?
我的意思是你给客户 使用了以后那个。不是你手里编译执行那个。

而且代码直接编译,协同工作的时候很麻烦。
mathe 2007-11-09
  • 打赏
  • 举报
回复
库文件最主要的好处就是你使用时不需要重新编译了。
很难想象,如果你每次写代码,都要重新编译libc和libm等标准库,那该有多麻烦。
不过C++中的标准模本库就只能用源文件方式发布了。
本人认为模块化同库文件没有关系。模块化的代码不是说你必须将每个模块都编译成一个独立的库文件,而是逻辑上的模块。
动态链接当然比静态链接更加灵活,替换一个模块的时候,其他模块可以完全不动:如果是静态链接,那么至少还要同全部的库文件重新链接一次。
  • 打赏
  • 举报
回复
还是动态链接,静态链接方便.
星羽 2007-11-08
  • 打赏
  • 举报
回复


因为你现在都是一个人写程序,确切说是写一个功能的项目

没涉及到项目间的协作,所以对动态连接没什么感觉
BluntBlade 2007-11-08
  • 打赏
  • 举报
回复
推荐一本书《大规模C++程序设计》。
里面对楼主所说的那些连接对象做了效率分析。
redex 2007-11-08
  • 打赏
  • 举报
回复
to star119119:
代码直接编译方面: 工程大了,文件涉及到 好几百m 你在看看????

=======================================

可是用makefile的话, 它是只编译那些你改动过的源代码文件啊, 比如你修改了某模块的
20个文件, 它只是编译这20个文件啊, 速度不会很慢吧?? 你不会改一个模块就改几百m内容吧??
star119119 2007-11-08
  • 打赏
  • 举报
回复
to star119119:
"静态连接库:
好处:在你升级或是改进软件的时候直接替换对应功能模块就可以了。不用大手术。 "
=======================================
你如果改了静态连接库, 主程序不需要重新编译么??

从新连接以下就可以了,我有一个项目,整个工程都编译要 20多个小时。你打算怎么弄?


动态连接库:
好处:和上面一样。更灵活。
缺点:比静态连接效率低。
=======================================
另外: 动态连接库效率比静态连接效率低 的结论从何而来呢??

参见windows核心编程动态连接库部分

"代码直接编译:
好处:你不用管理那么多工程。
缺点:如果一个模块需要变更,整个程序都要变更。如果一个人的模块出问题,整个工程都出问题。
如果工程浩大。你代码管理更复杂。 "
=======================================
如果一个模块需要变更,整个程序都要变更。如果一个人的模块出问题,整个工程都出问题???
一个模块出问题了, 我把这个模块改了重新编译整个应用不就行了, 谈不上 "整个程序都要变更 "吧?
是修改一处,再编译一次吧? 并且有makefile,jam类的自动build工具的话编译速度也不慢吧??

工程大了,文件涉及到 好几百m 你在看看????
redex 2007-11-08
  • 打赏
  • 举报
回复
to star119119:
"静态连接库:
好处:在你升级或是改进软件的时候直接替换对应功能模块就可以了。不用大手术。"
=======================================
你如果改了静态连接库, 主程序不需要重新编译么??

动态连接库:
好处:和上面一样。更灵活。
缺点:比静态连接效率低。
=======================================
另外: 动态连接库效率比静态连接效率低 的结论从何而来呢??

"代码直接编译:
好处:你不用管理那么多工程。
缺点:如果一个模块需要变更,整个程序都要变更。如果一个人的模块出问题,整个工程都出问题。
如果工程浩大。你代码管理更复杂。"
=======================================
如果一个模块需要变更,整个程序都要变更。如果一个人的模块出问题,整个工程都出问题???
一个模块出问题了, 我把这个模块改了重新编译整个应用不就行了, 谈不上"整个程序都要变更"吧?
是修改一处,再编译一次吧? 并且有makefile,jam类的自动build工具的话编译速度也不慢吧??
star119119 2007-11-08
  • 打赏
  • 举报
回复
静态连接库:
好处:在你升级或是改进软件的时候直接替换对应功能模块就可以了。不用大手术。
缺点:文件数量多了,影响启动时的效率,而且在程序内存空间里多了文件映射。
动态连接库:
好处:和上面一样。更灵活。
缺点:比静态连接效率低。
代码直接编译:
好处:你不用管理那么多工程。
缺点:如果一个模块需要变更,整个程序都要变更。如果一个人的模块出问题,整个工程都出问题。如果工程浩大。你代码管理更复杂。

所以还是按照功能模块划分一下比较好,但是并不是说使用连接库就好。看情况。
redex 2007-11-08
  • 打赏
  • 举报
回复
还有个好处: 就是 "保密"---即使编译成静态库也可以把自己的原创代码保密起来, 只给客户
提供二进制文件和使用说明文档

但写个c++模板库的话, 是不是还是必须得发布源代码??
andy_cai 2007-11-08
  • 打赏
  • 举报
回复
拿着源代码跑来跑去,是不合适的。
redex 2007-11-08
  • 打赏
  • 举报
回复
比如: 据说 动态库里动态申请的指针, 如果在客户程序里释放的话程序就会崩溃??
redex 2007-11-08
  • 打赏
  • 举报
回复
另外, 大家说点静态库和动态库相对于 "源代码编译单元"的劣势啊, 它们不可能全是优势吧???
redex 2007-11-08
  • 打赏
  • 举报
回复
1、单一模块的编译构建速度加快,便于做快速迭代开发
---等于把一个集中编译的一个大块分成小块在不同机器上同时编译, 这个好处可以理解
2、职责分离,强迫接口设计的清晰合理化,同时便于将设计过程分为不同的层次,指派给不同的人进行。
---这个好象不写成静,动态库的形式, 一大块貌似也能实现???
3、由于接口被强化,各模块的独立测试可以做得更完备。这也有助于第一条。
---不写成库的模块, 各模块的独立测试就做得不完备?? 还是不好做还是怎么样啊??
4、便于重用。很多的测试和怀疑是可以避免重复的了。
---如果长年累积,持续改进的源代码, 虽然没编译成静态或动态库, 但用时直接搞过去编译不是也
便于重用么?? 这个貌似也没什么优点可言吧??
Wolf0403 2007-11-08
  • 打赏
  • 举报
回复
把单一可执行文件分解成不同的连接块实际代表的是软件的模块化。软件被二进制模块化之后的优点:

1、单一模块的编译构建速度加快,便于做快速迭代开发
2、职责分离,强迫接口设计的清晰合理化,同时便于将设计过程分为不同的层次,指派给不同的人进行。
3、由于接口被强化,各模块的独立测试可以做得更完备。这也有助于第一条。
4、便于重用。很多的测试和怀疑是可以避免重复的了。
redex 2007-11-08
  • 打赏
  • 举报
回复
直接代码编译, 编译"效率"确实会降低, 但改动态库或者静态库的人, 还是需要把自己的模块
编译一遍: 也就是 你不干我干, 反正活总得有人干.

正如oo所宣称的封装一样: 复杂性封装到对象里了并不代表就没复杂性了, 只是复杂从一个地方
转到另一个地方了.

总之工作效率(指团队协作方面浪费了大量沟通时间)好象没有提高??
飞哥 2007-11-08
  • 打赏
  • 举报
回复
链接库,方便是优点,不管动态静态,当然动态链接库,和静态的还有区别,都知道就不说了
至于直接代码编译,编译"效率"会降低,而且可能存在单元,模块的冲突问题

总的看来动态要好于静态
静态和直接的很难说
dxcnjupt 2007-11-08
  • 打赏
  • 举报
回复
如果你的程序已经发布给客户了,这时候你发现库函数有bug

那么修改dll制作补丁会更容易一点,只要覆盖掉原先的dll就可以了
如果是完整的exe程序,也许你需要把原先的软件卸载后重新安装。
redex 2007-11-08
  • 打赏
  • 举报
回复
还有: 静态链接 对 动态链接, 具体有哪些方面的优势呢??
加载更多回复(1)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧