编译与静态链接

时间:2015-02-16 10:48:10

标签: c++ compilation linker

我有这些文件: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它也有效。

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

1 个答案:

答案 0 :(得分:2)

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

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

这样做也是如此,但您明确地提供了一个静态库来链接。这不会搜索,并且它不可能链接到共享库,它只是将目标文件从存档中拉出来并在链接时使用它们。