C++ 编译与静态链接

C++ 编译与静态链接,c++,compilation,linker,C++,Compilation,Linker,我有以下文件:help.cpp help.h help.o main.cpp 我想创建一个静态库 help.cpp main.cpp 我想为什么不这样做:g++main.cpp libST.a,它也能工作 请告诉我,命令2和命令3之间有什么区别?在这种情况下,两者的行为(几乎)相同,但有一些区别 g++ main.cpp -L . -l ST 这将编译main.cpp并尝试将其与名为libST的内容链接。这将搜索整个链接器搜索路径(通常为/usr/local/lib、/lib和/usr/li

我有以下文件:help.cpp help.h help.o main.cpp 我想创建一个静态库

help.cpp

main.cpp

  • 我想为什么不这样做:
    g++main.cpp libST.a
    ,它也能工作


  • 请告诉我,命令2和命令3之间有什么区别?

    在这种情况下,两者的行为(几乎)相同,但有一些区别

    g++ main.cpp -L . -l ST
    
    这将编译main.cpp并尝试将其与名为
    libST
    的内容链接。这将搜索整个链接器搜索路径(通常为/usr/local/lib、/lib和/usr/lib),包括当前目录(因为您使用
    -L
    指定了它)。请注意,只要名为libST.a或libST.so,就可以链接到共享库或静态库

    如果当前文件夹中不存在libST,则链接器也会在其知道的所有其他文件夹中进行搜索

    g++ main.cpp libST.a
    

    这也是一样的,但是您显式地提供了一个静态库来进行链接。这不会搜索,也不可能链接到共享库,它只会将目标文件从存档中拉出,并在链接时使用这些文件。

    标题有点混乱,还有其他建议吗?1.在这两种情况下,库的内容都将复制到最终可执行文件中?2.实际上,区别在于,在第一个命令中,它还将搜索一个*.so文件,而在第二个命令中,我直接给链接器一些可以使用的东西,而不需要搜索其他东西?感谢You@Oleg-这要看情况了。您可以将编译器配置为只拉入正在使用的位,但是可以,在这两种情况下(给定特定的第一个命令),库都将被拉入。另外,对于(2),是的,不同之处在于编译器将如何搜索库。。。听起来很新鲜,你能给我一个关键字来搜索吗?我相信它既有
    -fffunction部分
    也有
    -gc部分
    #include <iostream>
    #include "help.h"
    
    using namespace std;
    
    int main()
    {
     hello();
    return 0;
    }
    
    hi
    
    g++ main.cpp -L . -l ST
    
    g++ main.cpp libST.a