编译与静态链接

Compiling vs Static Linking

我有这些文件:help.cpp help.h help.o main.cpp 我想创建一个静态库。

help.cpp

#include <iostream>
#include "help.h"

using namespace std;

void hello()
{
 cout << "hi" << endl;
}

help.h

#ifndef HELP_H
#define HELP_H

void hello();

#endif

main.cpp

#include <iostream>
#include "help.h"

using namespace std;

int main()
{
 hello();
return 0;
}

创建静态库:

  1. ar rcs libST.a help.o

  2. g++ main.cpp -L . -l ST #to create my binary

    我运行它,打印出来

    hi
    
  3. 我想为什么不这样做:g++ main.cpp libST.a 而且效果也很好。

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

在这种情况下,两者的行为(几乎)相同,但存在一些差异。

g++ main.cpp -L . -l ST

这会编译 main.cpp 并尝试 link 它针对名为 libST 的东西。这将搜索整个 linker 搜索路径(通常是 /usr/local/lib、/lib 和 /usr/lib),包括当前目录(因为您使用 -L 指定了它)。请注意,这可能 link 针对共享库或静态库,只要它被称为 libST.a 或 libST.so.

如果当前文件夹中不存在 libST,您的 link 用户将在它知道的所有其他文件夹中搜索。

g++ main.cpp libST.a

这样做是一样的,但是您明确地向 link 提供了一个静态库。这不会搜索,也不会 link 针对共享库,它只会从存档中提取目标文件并在 linking 时使用它们。