• link 和 runtime-link,搭配shared 和 static(转)


    原文转自 http://blog.csdn.net/yasi_xi/article/details/8660549

    参考:

    http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1300328832.A.html

    http://noteonx.blogspot.com/2009/04/boost.html

    http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

    C / C++库的形式,好晕啊!

    boost库在build时,./b2 install 后面可以跟一些参数,涉及到动态库、静态库的参数有以下四种搭配方式:

    link=static runtime-link=static

    link=static runtime-link=shared

    link=shared runtime-link=shared

    link=shared runtime-link=static (这种配置我试的结果是,报错,这样的搭配是非法的)

    究竟它们都是什么意思呢?

    我的粗浅理解:

    link=static runtime-link=static 

    build出来的就是.a (windows .lib) 文件,没有.so (windows .dll) 文件,link到可执行程序中以后,就成为后者的一部分,和后者融为一体了

    link=static runtime-link=shared 

    build出来的同时有 .a (windows .lib) 文件和 .so (windows .dll) 文件,link时,是指定 .a (windows .lib) 文件,后者成为可执行程序的一部分,运行时,通过融入可执行程序的 .a (windows .lib) 的信息,去动态加载 .so (windows .dll) 文件,其实质仍然是动态链接

    link=shared runtime-link=shared

    build出来的只有 .so (windows .dll) 文件,没有.a (windows .lib) 文件,但是,可执行程序在运行时,怎么找到动态库文件并加载它呢?

    网上看到的最多的介绍文章是下面这样的:

    link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用 static方式。

    runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方 式,这样runtime-link和link一共可以产生4种组合方式。虽然它和link属性没有直接关系,但我们习惯上,一个工程如果用动态链接那么所 有库都用动态链接,如果用静态链接那么所有库都用静态链接。所以这样其实只需要编译2种组合即可,即link=shared runtime-link=shared和link=static runtime-link=static。

    还有人总结windows下boost库的命名特点:

    link=static runtime-link=static 得到 libboostxxxxx.lib
    link=shared runtime-link=shared 得到 boostxxxx.lib 和 boostxxxx.dll
    由以上的文件夹层次结构基本就可以得出结论:
    1、以“lib”开头的是“link-static”版本的,而直接以“boost”开头的是“link-shared”版本的。
    2、有“d”的为debug版本,没有的则是release版本。
    3、有“s”的为“runtime-link-static”版本,没有的则是“runtime-link-shared”版本。
    4、有“mt”的为“threading-multi”版本,没有的则是“threading-single”版本。

    一位在微软做过编译器开发的大牛是这样解释的:

    假设一个库A依赖于库B,我们自己的程序client依赖于库A,即:

    那么,link指的是client->A,runtime-link指的是A -> B

    配置

    链接过程

    运行时需要的文件

    link=static

    runtime-link=static

    client通过A.a (A.lib)静态包含A;

    A通过B.a (B.lib)静态包含B;

    不关 .so .dll的事

    client

    link=static

    runtime-link=shared

    client通过A.a (A.lib)静态包含A;

    在运行时,client要动态调用B.so (B.dll)

    client

    B.so (B.dll)

    link=shared

    runtime-link=shared

    client会包含A.a (A.lib);

    A会包含 B.a (B.lib);

    但都只保存动态库的真正实现的stub,运行时通过stub去动态加载 A.so (A.dll), B.so (B.dll) 中的实现

    client

    A.so (A.dll)

    B.so (B.dll)

    link=shared

    runtime-link=static

    client会包含A.a (A.lib),但只包含真正实现的stub;

    A通过B.a (B.lib)静态包含B;

    运行时,client会动态调用A.so (A.dll)

    client

    A.so (A.dll)

     
  • 相关阅读:
    7.22Java之Lambda表达式练习
    7.22Java线程池的使用
    7.20Java之封装multipart/formdata格式的表单并请求API
    7.22Java线程池概念和原理
    7.16Java接口之关于ContentType中application/xwwwformurlencoded和multipart/formdata的区别
    7.22Java之函数式编程思想
    7.23Java之Lambda表达式之省略形式
    7.17Java之HttpClient类发送application/xwwwformurlencoded类型的请求
    7.19Java之HttpClient类发送GET请求方法
    7.16Java之使用HttpClient类
  • 原文地址:https://www.cnblogs.com/happykoukou/p/6992806.html
Copyright © 2020-2023  润新知