我的环境: 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++ 静态动态库 混链接.的更多相关文章

  1. gcc -rpath 指定动态库路径

    gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405

  2. gcc 混合连接动态库和静态库

    当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式.这时需要作用-Wl的方式 gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -W ...

  3. linux常用命令及一些静态动态库相关知识

    1 查找然后grep,最后在复制到特定目录 find . -depth -name *.java | xargs grep -i lijiangtao | awk -F ":" ' ...

  4. 动态库的链接和链接选项-L,-rpath-link,-rpath

    https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行 ...

  5. linux下生成动态库和链接动态库

    1.生成动态库 src/test.h #ifndef _TEST_H_HH #define _TEST_H_HH void print(); #endif src/test.cpp #include ...

  6. Linux下gcc编译控制动态库导出函数小结

    根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility(" ...

  7. VS2010 编译 sqlite3 生成动态库和链接库

    如果想以dll的方式使用sqlite而新建空的dll工程,添加sqlite源文件,会发现能生成dll,但缺乏lib函数信息映射库,单独使用dll文件是比较麻烦的,而网上多数做法是通过lib.exe手动 ...

  8. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  9. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

随机推荐

  1. 225. Implement Stack using Queues

    代码如下: class MyStack { // Push element x onto stack. Queue<Integer> queue=new ArrayDeque<> ...

  2. tyvj 1056 能量项链 区间dp (很神)

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

  3. swift与OC混编高级教程之混编框架的创建和调用

    首先创建一个project取个名字叫“MyMixed”,选择iOS-framework&library-cocoa touch framework 然后在里面创建一个SwiftView.swi ...

  4. 黑马程序员——JAVA基础之set集合

    ------- android培训.java培训.期待与您交流! ---------- Set:       元素是无序(存入和取出的顺序不一定一致),元素不可以重复.    Set接口中常用的类: ...

  5. DuiLib——第一篇UIManager

    DUiLib 源码分析 --以UiLib 1.01版为分析目标 -------------------------------------------------------------------- ...

  6. 论文笔记之:Generative Adversarial Nets

    Generative Adversarial Nets NIPS 2014  摘要:本文通过对抗过程,提出了一种新的框架来预测产生式模型,我们同时训练两个模型:一个产生式模型 G,该模型可以抓住数据分 ...

  7. c#判断特殊字符?

    , ).Select(c => (char)c).Where(c => char.IsSymbol(c) || char.IsPunctuation(c)).ToArray()); Deb ...

  8. media type与media query

    media type(媒体类型)是css 2中的一个非常有用的属性,通过media type我们可以对不同的设备指定特定的样式,从而实现更丰富的界面.media query(媒体查询)是对media ...

  9. 00-Java 语言简介

    一.开发环境搭建: (一).JAVA语言简介: 1.JAVA语言简介: (1)什么是JAVA:Java是一种计算机编程语言.它是一种计算机编程语言.它是一种软件开发平台.它是一种软件运行平台.它是一种 ...

  10. Java 实现学生信息管理系统

    编写一个简单的学生管理信息系统. 在oracle中设计一张学生表,以学号作为关键字. 其他学生信息有:姓名.手机号. 在进入系统时,显示如下菜单: ************************** ...