jiang1234321
V2EX  ›  问与答

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

  •  
  •   jiang1234321 · Mar 30, 2019 · 4326 views
    This topic created in 2627 days ago, the information mentioned may be changed or developed.

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

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

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

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

    Linux 上对文件后缀名不太敏感
    jiang1234321
        5
    jiang1234321  
    OP
       Mar 30, 2019
    @lcdtyph 这个倒是了解一点,主要是除了后缀之外,动态库和静态库的区别是什么,为什么 file 出来的结果会不一样?
    liuminghao233
        6
    liuminghao233  
       Mar 30, 2019 via iPhone
    csapp 705 页
    PPing520
        7
    PPing520  
       Mar 30, 2019
    静态库是打包在可执行文件一起的,动态库的动态链接有多种情况:1,启动时链接,2,运行时链接,并不包含在可执行文件之中
    lcdtyph
        8
    lcdtyph  
       Mar 30, 2019 via iPhone
    @jiang1234321
    静态库就是简单的.o (可重定位文件)文件的打包
    动态库就更像是一个可执行文件了,也是 elf 格式的一种。有些动态库甚至可以直接执行。
    mikeguan
        9
    mikeguan  
       Mar 30, 2019 via Android
    Linux 是根据魔数确定文件类型的,一般情况下和后缀没关系。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   974 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 19:54 · PVG 03:54 · LAX 12:54 · JFK 15:54
    ♥ Do have faith in what you're doing.