首先,请考虑以下情况.
以下是一个程序:
// test.cpp
extern "C" void printf(const char*, ...);
int main() {
printf("Hello");
}
Run Code Online (Sandbox Code Playgroud)
下面是一个图书馆:
// ext.cpp (the external library)
#include <iostream>
extern "C" void printf(const char* p, ...);
void printf(const char* p, ...) {
std::cout << p << " World!\n";
}
Run Code Online (Sandbox Code Playgroud)
现在我可以用两种不同的方式编译上面的程序和库.
第一种方法是在不链接外部库的情况下编译程序:
$ g++ test.cpp -o test
$ ldd test
linux-gate.so.1 => (0xb76e8000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7518000)
/lib/ld-linux.so.2 (0xb76e9000)
Run Code Online (Sandbox Code Playgroud)
如果我运行上面的程序,它将打印:
$ ./test
Hello
Run Code Online (Sandbox Code Playgroud)
第二种方法是使用指向外部库的链接编译程序:
$ g++ -shared -fPIC ext.cpp -o libext.so
$ g++ test.cpp -L./ -lext -o …Run Code Online (Sandbox Code Playgroud) 在'C',Linux,
我是否需要静态链接静态链接,或者我需要的共享库?如果没有,为什么不呢?(它们不包含相同的数据吗?)