编译与静态链接
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;
}
创建静态库:
ar rcs libST.a help.o
g++ main.cpp -L . -l ST #to create my binary
我运行它,打印出来
hi
我想为什么不这样做: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 时使用它们。
我有这些文件: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;
}
创建静态库:
ar rcs libST.a help.o
g++ main.cpp -L . -l ST #to create my binary
我运行它,打印出来
hi
我想为什么不这样做:
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 时使用它们。