gcc/g++ 静态动态库 混链接.
我的环境: centos6 x64. gcc4.4.7
在使用gcc/g++ 编译程序时我们希望指向一些库是使用静态的链接方式. 另外的一些是动态的方式.
我以boost 为例.
如果我们要使用静态库则是这样的:
# g++ main.cpp -lpthread /usr/lib64/libboost_thread.a /usr/lib64/libboost_system.a
静态库直接写路径. 动态前面加-l 这样也可以实现.
但有没有更好的办法呢. 有.
先参考个帖子:http://stackoverflow.com/questions/3698321/g-linker-force-static-linking-if-static-library-exists
根据老外这个帖子 照猫画狗
g++ main.cpp -lrt -Wl,-Bstatic -lboost_system -lboost_thread -Wl,-Bdynamic
这样就可以了.
再来看一下老外的这个例子:
g++ main.cpp -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
Will link zlib and libfoo as static, and libbar as dynamic . --as-needed will drop any unused dynamic library.
但是这个过程中我用了将近1天时间才搞定的.
因为我刚开始是这样写的:
g++ main.cpp -lrt -Wl,-Bstatic -lboost_system -lboost_thread
这样它就会出现这样的错误提示:
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
于是我就按照这个提示搞. 意思就是 libgcc_s.so 没找到. 于是 我就折腾这个. 明明它在.可是就是提示找不到这个错误.
搞了大半天就要放弃了..
我最后想是不是 要在后面加 -Wl,-Bdynamic 其它的库才能默认动态链接.
试了一下果然..
我在后面加了这个就成功了.
g++ main.cpp -lrt -Wl,-Bstatic -lboost_system -lboost_thread -Wl,-Bdynamic -Wl,--as-needed
-Wl,--as-needed 这个选项是可选的是 这个选项的意思是去除没有使用的动态库
还有一个比较简单的错误就是 :
thread.cpp:(.text+0x1a93): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1b08): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1b6f): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1bd6): undefined reference to `clock_gettime'
thread.cpp:(.text+0x1c3d): undefined reference to `clock_gettime'
一般动态链接时不会出现这个错. 是静态链接时才出这个错.
加上 -lrt 选项就好了.
gcc/g++ 静态动态库 混链接.的更多相关文章
- gcc -rpath 指定动态库路径
gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405
- gcc 混合连接动态库和静态库
当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式.这时需要作用-Wl的方式 gcc test.cpp -L. -Wl,-Bstatic -ltestlib -W ...
- linux常用命令及一些静态动态库相关知识
1 查找然后grep,最后在复制到特定目录 find . -depth -name *.java | xargs grep -i lijiangtao | awk -F ":" ' ...
- 动态库的链接和链接选项-L,-rpath-link,-rpath
https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行 ...
- linux下生成动态库和链接动态库
1.生成动态库 src/test.h #ifndef _TEST_H_HH #define _TEST_H_HH void print(); #endif src/test.cpp #include ...
- Linux下gcc编译控制动态库导出函数小结
根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility(" ...
- VS2010 编译 sqlite3 生成动态库和链接库
如果想以dll的方式使用sqlite而新建空的dll工程,添加sqlite源文件,会发现能生成dll,但缺乏lib函数信息映射库,单独使用dll文件是比较麻烦的,而网上多数做法是通过lib.exe手动 ...
- [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
随机推荐
- Java-->在txt文件每一行前加行数和冒号
--> 这里是添加后复制到另一个文件,对同一文件的操作下次进行... package com.dragon.java.addtotxt; import java.io.BufferedReade ...
- Apache Flex + Adobe Flash Builder环境配置
在开始学习Flex之前,需要配置开发环境.Apache Flex SDK包含了你开发所需要的东西,当然除了集成开发环境(Integrated Development Environment,IDE). ...
- Codeforces Round #145 (Div. 2, ACM-ICPC Rules)
A. Lefthanders and Righthanders \(i\)与\(i+\frac n2\)匹配,根据左右手调整位置. B. Reading 排序,取前\(k\)个. C. Weather ...
- 1-3-2 Windows应用程序常用消息
主要内容:介绍Windows编程中常用的消息 1.WM_LBUTTONDOWN产生单击鼠标左键的消息 lParam: 低字节包含当前光标的X坐标值 X = LOWORD(lParam); 高字节包含当 ...
- PHP防止页面刷新、重复提交数据
PHP防止页面刷新.重复提交数据 (2011-12-09 16:52:45) 转载▼ 标签: it 分类: php技术相关 闲来无事看了一下php session ,又在网上看了防止页面刷新重复提交数 ...
- URAL 2030 Awesome Backup System
Awesome Backup System Time limit: 2.0 secondMemory limit: 64 MB It is known that all people can be d ...
- click 绑定(一)无参数的click 事件绑定
目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 例子 <d ...
- FileReader/FileWriter复制文件
public class Test{ /*FileReader/FileWriter读写乱码,待处理*/ public static void main(String[] args) throws I ...
- Instructions函数对照表:02 xmmintrin.h与SSE指令集[转]
更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴 R:寄存器.M:64位MM寄存器:X: ...
- [转]easyui常用控件及样式API中文收藏
[转]easyui常用控件及样式收藏 2013-05-06 23:01 30612人阅读 评论(0) 收藏 举报 分类: java ee(5) 目录(?)[+] CSS类定义: div easyu ...