V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiang1234321
V2EX  ›  问与答

C++编译的时候,怎么判断链接的是动态库还是静态库?

  •  
  •   jiang1234321 · 2019-03-30 15:42:31 +08:00 · 3203 次点击
    这是一个创建于 1188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    g++ test.cpp -L./ -lmylib -o test

    请问,编译器是如何判断 mylib 是静态库还是动态库?是通过后缀吗?那直接改后缀可以吗?

    9 条回复    2019-03-30 21:41:36 +08:00
    jiang1234321
        1
    jiang1234321  
    OP
       2019-03-30 15:44:16 +08:00
    测试了一下,直接改.a 为.so 是可以正常编译运行 test 的
    lcdtyph
        2
    lcdtyph  
       2019-03-30 16:00:43 +08:00 via iPhone
    静态库和动态库的文件格式不一样的
    .a 和.so 只是约定好的文件后缀,-l 参数会依次寻找对应的.so 和.a 文件

    在 win 的 cl.exe 上情况有一些变化,动态链接还需要在头文件里声明
    SPACELAN
        3
    SPACELAN  
       2019-03-30 16:07:50 +08:00
    -l 会先匹配.so 再匹配.a,如果想要显式链接静态库,可以直接写静态库路径
    Gcourage
        4
    Gcourage  
       2019-03-30 16:30:48 +08:00 via Android
    用 file 命令可以查看是什么文件。
    g++最终会调动 ld 命令去链接的,应该 ld 工具会根据文件来做静态链接,还是动态链接。

    Linux 上对文件后缀名不太敏感
    jiang1234321
        5
    jiang1234321  
    OP
       2019-03-30 17:56:43 +08:00
    @lcdtyph 这个倒是了解一点,主要是除了后缀之外,动态库和静态库的区别是什么,为什么 file 出来的结果会不一样?
    liuminghao233
        6
    liuminghao233  
       2019-03-30 18:55:22 +08:00 via iPhone
    csapp 705 页
    PPing520
        7
    PPing520  
       2019-03-30 19:20:28 +08:00
    静态库是打包在可执行文件一起的,动态库的动态链接有多种情况:1,启动时链接,2,运行时链接,并不包含在可执行文件之中
    lcdtyph
        8
    lcdtyph  
       2019-03-30 19:59:25 +08:00 via iPhone
    @jiang1234321
    静态库就是简单的.o (可重定位文件)文件的打包
    动态库就更像是一个可执行文件了,也是 elf 格式的一种。有些动态库甚至可以直接执行。
    mikeguan
        9
    mikeguan  
       2019-03-30 21:41:36 +08:00 via Android
    Linux 是根据魔数确定文件类型的,一般情况下和后缀没关系。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3122 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:38 · PVG 18:38 · LAX 03:38 · JFK 06:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.