当前位置: 编程技术>其它
本页文章导读:
▪指定使用静态库
Linux动态链接库的问题_静态库、动态链接库同时存在时,gcc/g++默认用动态库,参数-WI,-Bstatic指定使用静态库,参数-WI,-Bdynamic指定使用动态库\编译OK,运行找不到的问题_解决-WI,rlibpathname &.........
▪VC++ 6.0 生成dll 和 对应lib的方法 转载并修改 方法一 新建一个Console application 建立两个文件 dll.h 和 dll.cpp dll.h ================ int add(int ,int);dll.cpp 在函数前面 extern "C" __declspec(dllexport) ========.........
▪linux下so动态库一些不为人知的秘密(中) 2 继续上一篇《 linux下so动态库一些不为人知的秘密(中) 》介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH。
[steve.........
[1]指定使用静态库
Linux动态链接库的问题_静态库、动态链接库同时存在时,gcc/g++默认用动态库,参数-WI,-Bstatic指定使用静态库,参数-WI,-Bdynamic指定使用动态库\编译OK,运行找不到的问题_解决-WI,rlibpathname
2011-03-11 14:30:23| 分类: Linux系统编程|字号 订阅
1、在Linux下,动态库和静态库同事存在时,gcc/g++的链接程序,默认链接的动态库。
可以使用下面的方法,给连接器传递参数,看是否链接动态库还是静态库。
-WI,-Bstatic -llibname //指定让gcc/g++链接静态库
使用:
gcc/g++ test.c -o test -WI,-Bstatic -llibname
-WI,-Bdynamic -llibname //指定让gcc/g++链接动态库
使用:
gcc/g++ test.c -o test -WI,-Bdynamic -llibname
如果要完全静态加在,使用-static参数,即将所有的库以静态的方式链入可执行程序,这样生成的可执行程序,不再依赖任何库,同事出现的问题是,这样编译出来的程序非常大,占用空间。
2、Linux下动态库为什么会出现编译OK,运行时找不到的情况。
[2]VC++ 6.0 生成dll 和 对应lib的方法 转载并修改
方法一
新建一个Console application
建立两个文件 dll.h 和 dll.cpp
dll.h
================
int add(int ,int);
dll.cpp
{
return x+y;
}
在project=》setting=》link 最下面的 project options中 最后 添加 /dll
方法二
使用def文件
建立一个def文件
内容为:
新建一个Console application
建立两个文件 dll.h 和 dll.cpp
dll.h
================
int add(int ,int);
dll.cpp
在函数前面 extern "C" __declspec(dllexport)
=================extern "C" __declspec(dllexport)
int add(int x,int y){
return x+y;
}
在project=》setting=》link 最下面的 project options中 最后 添加 /dll
方法二
使用def文件
新建一个Console application
建立两个文件 dll.h 和 dll.cpp
dll.h
================
int add(int ,int);
dll.cpp
=================
int add(int x,int y)
{
return x+y;
}
建立两个文件 dll.h 和 dll.cpp
dll.h
================
int add(int ,int);
dll.cpp
=================
int add(int x,int y)
{
return x+y;
}
建立一个def文件
内容为:
LIBRARY (可能不需要)
EXPORTS
add
EXPORTS
add
在project=》setting=》link 最下面的 project options中 最后 添加 /dll
谢丛文 2013-01-04 16:23 发表评论
[3]linux下so动态库一些不为人知的秘密(中) 2
继续上一篇《 linux下so动态库一些不为人知的秘密(中) 》介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH。
[stevenrao] $ g++ -o demo -L /tmp/ -ltmp main.cpp
[stevenrao] $ readelf -d demo
Dynamic section at offset 0xb98 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtmp.so]
....
0x000000000000000f (RPATH) Library rpath: [/tmp/]
另外还可以通过配置/etc/ld.so.conf,在其中加入一行
/tmp/
这个配置项也是只对运行期有效,并且是全局用户都生效,需要root权限修改,修改完后需要使用命令ldconfig 将 /etc/ld.so.conf 加载到ld.so.cache中,避免重启系统就可以立即生效。
除了前面介绍的那些搜索路径外,还有缺省搜索路径/usr/lib/ /lib/ 目录,可以通过-z nodefaultlib编译选项禁止搜索缺省路径。
[stevenrao] $ g++ -o demo -z nodefaultlib -L/tmp -ltmp main.cpp
[stevenrao] $ ./demo
./demo: error while loading shared libraries: libstdc++.so.6: cannot open shared object file
这么多搜索路径,他们有个先后顺序如下
1、RUMPATH 优先级最高
2、RPATH 其次
3、LD_LIBRARY_PATH
4、/etc/ld.so.cache
5、/usr/lib/ /lib/
查看一个程序搜索其各个动态库另一个简单的办法是使用 LD_DEBUG这个环境变量;
[stevenrao] $ export LD_DEBUG=libs
[stevenrao] $ ./demo
下一篇介绍动态库内符号问题
tqsheng 2013-01-04 16:59 发表评论
最新技术文章:
 
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!