静态cmake 链接 静态库库文件的问题?

如何不加载静态链接库中不需要的目标文件
[问题点数:50分,结帖人kingstarer]
如何不加载静态链接库中不需要的目标文件
[问题点数:50分,结帖人kingstarer]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2011年5月 C/C++大版内专家分月排行榜第二2010年9月 C/C++大版内专家分月排行榜第二
2009年11月 C/C++大版内专家分月排行榜第三
2011年5月 C/C++大版内专家分月排行榜第二2010年9月 C/C++大版内专家分月排行榜第二
2009年11月 C/C++大版内专家分月排行榜第三
2010年10月 C/C++大版内专家分月排行榜第二
2010年10月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。来 自:三体星系
等 级:贵宾
威 望:22
帖 子:493
专家分:1579
可以编译成静态库的。要不就给目标电脑安装运行库。
静态库编译就是把所需要的库直接编译进程序文件里,目标电脑不需要安装运行库,但是程序文件会比较大。
动态库就是调用.dll里的库函数。运行程序的机子需要安装相应的运行库才可以,程序文件一般很小。。
等 级:论坛游民
帖 子:40
专家分:42
以下是引用apull在 21:14:00的发言:
可以编译成静态库的。要不就给目标电脑安装运行库。
静态库编译就是把所需要的库直接编译进程序文件里,目标电脑不需要安装运行库,但是程序文件会比较大。
动态库就是调用.dll里的库函数。运行程序的机子需要安装相应的运行库才可以,程序文件一般很小。。
作者能把动态和静态库多多解释点儿吗?路过,想多学习点儿~~
来 自:淮河河畔
等 级:版主
威 望:61
帖 子:2374
专家分:13291
回复 3楼 如蜗牛
静态库和动态库链接分析
1、文件组成结构
静态库:lib&&&头文件
动态库:lib&&&dll&&头文件
从组成上看,动态库和静态库的差异在于动态库多了一份dll文件,导致动态库可以独立存在,
2、链接方式
静态库:只能静态链接
动态库:动态链接和静态链接
3、运行效果
静态库:相当于直接把代码段写入到exe或dll文件中
动态库:相当于与exe或dll形成了一种关系,exe或dll可以到动态库中去查找所需要的函数
静态库:不需要导出就可以被链接使用
动态库:需要导出后方可使用(动态链接)
静态库:编译后只有lib文件
动态库:若没有导出函数刚只能编译出dll文件而没有lib因此无法静态链接
6、导出类的链接
静态库:不需要导出,可以直接链接
动态库:必需要导出才可以链接,必须将类中所有函数导出才可以使用(对于public)
对于(protected)无论导出或者不导出均无法直接使用
对于(private)无论导出或者不导出均无法直接使用
7、导出子类
静态库:不需要导出,直接使用文件头就可以使用
动态库:必须导出子类,
&&&若仅使用到子类函数,可以不用导出父类。
若需要使用到父类中继承的函数时,需要将父类中相应的函数导出,否则无法使用
私有函数成员无法在外部使用
若类不导出,只导出成员函数,同样可以正常使用,
等 级:论坛游民
帖 子:10
专家分:27
回复 4楼 邓士林
很详细,嘿嘿,明白了。
等 级:论坛游民
帖 子:40
专家分:42
回复 4楼 邓士林
因为没有实际试验,不能深入理解,或者说理解的程度还很低,但衷心谢谢您这么详细的讲解~~~我已经收藏下来,留待真正涉及到这方面的知识时深入理解!如果您有什么好的建议,可以帮助理解,当然更加欣喜!!!
版权所有,并保留所有权利。
Powered by , Processed in 0.023383 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved当前位置: >
> 怎么在没有安装Microsoft Visual C++ 6.0的电脑上运行MFC产生的.EXE文件 应用静态链接库之后还是不行
怎么在没有安装Microsoft Visual C++ 6.0的电脑上运行MFC产生的.EXE文件 应用静态链接库之后还是不行
jjack900 & at
如何在没有安装Microsoft Visual C++ 6.0的电脑上运行MFC产生的.EXE文件 应用静态链接库之后还是不行我用MFC做了一个带串口控件的界面,我把它拿到没有安装Microsoft Visual C++ 6.0的电脑上去调试,在有的电脑上会提示缺少3个.dll文件,我添加之后再那台没有安装Microsoft Visual C++ 6.0的电脑上就可以用了 &
可是在我把这个.exe拿到另一个没有安装Microsoft Visual C++ 6.0的电脑上运行时,那台电脑上也不提示缺少.dll文件,.exe文件就是打不开,就是不能运行,请问各位大侠这是什么原因呢
我是在XP下运行的,那台不能运行的电脑安装的也是XP系统,不过可能那个可能是正版的XP,不知道这个能不能运行是否与系统是不是正版有关呢? &
我按照有关资料上说的产生Release模式下的.exe文件,把其设置为静态链接库都不管用,请大家帮忙查找一下原因。 &
我是菜鸟希望大家别见笑
你看看是不是缺少MFC71d.dll msvcp71d.dll msvcr71d.dll
jjb1015 & &
& & (0)(0)引用应该就是上面的3个DLL
jjbuxiang & &
& & (0)(0)引用可能是串口控件没有注册吧jjc357 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-lienhua-161文件的时间每个文件都有三个时间...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......页面导航:
→ 正文内容 动态链接库和静态链接库
GCC 编译使用动态链接库和静态链接库的方法
根据链接时期的不同,库又有静态库和动态库之分,有别于静态库,动态库的链接是在程序执行的时候被链接的
1 库的分类
根据链接时期的不同,库又有静态库和动态库之分。
静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。
有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)
2 静态库和动态库的比较
链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。
首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。
再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。
而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。
那么,是不是静态库就一无是处了呢?
答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。
所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。
动态链接库
1. 创建动态链接库
代码如下:#include&stdio.h&void hello(){&&printf("hello world/n");}
用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。
2. 再编辑一个测试文件test.c,内容如下
代码如下:#include&stdio.h&int main(){&&printf("call hello()");&&hello();}
编译 gcc test.c -lhello-l 选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.但这样还不行,编译会出错。
In function `main':test.c:(.text+0x1d): undefined reference to `hello'collect2: ld returned 1 exit status这是因为hello这个库在我们自己的路径中,编译器找不到。需要使用-L选项,告诉hello库的位置gcc test.c -lhello -L. -o test-L .告诉编译器在当前目录中查找库文件
3. 编译成功后执行./test, 仍然出错
说找不到库
有两种方法:一、可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。二、把当前路径加入环境变量LD_LIBRARY_PATH中当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。
我们采用第二种方法:export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH这样,再执行就成功了。
下面再讲讲静态链接库
仍使用刚才的hello.c和test.c。1. gcc -c hello.c 注意这里没有使用-shared选项2. 把目标文件归档&&& ar -r libhello.a hello.o&&& 程序 ar 配合参数 -r 创建一个新库 libhello.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。3. 在程序中链接静态库&&&&&&&&&& gcc test.c -lhello -L. -static -o hello.static 或者&& gcc test.c libhello.a -L. -o hello.static
生成的hello.static就不再依赖libhello.a了
两个有用的命令
file程序是用来判断文件类型的,在file命令下,所有文件都会原形毕露的。顺便说一个技巧。有时在 windows下用浏览器下载tar.gz或tar.bz2文件,后缀名会变成奇怪的tar.tar,到Linux有些新手就不知怎么解压了。但 Linux下的文件类型并不受文件后缀名的影响,所以我们可以先用命令file xxx.tar.tar看一下文件类型,然后用tar加适当的参数解压。
另外,还可以借助程序ldd实用程序来判断。ldd是用来打印目标程序(由命令行参数指定)所链接的所有动态库的信息的,如果目标程序没有链接动态库,则打印“not a dynamic executable”,ldd的用法请参考manpage。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910

我要回帖

更多关于 静态链接库 的文章

 

随机推荐