下面是针对“Linux下g++编译与使用静态库和动态库的方法”的完整攻略:
1. 编译静态库
1.1 静态库介绍
静态库是在程序编译阶段将库文件的代码全部加入到生成的可执行文件中,因此在程序运行时不需要再去加载这些库文件。另外,同一份静态库可以同时被多个程序使用,节省系统资源。
1.2 编译静态库的方法
编写样例程序如下:
// test.cpp
#include <iostream>
void foo() {
std::cout << "Hello, world" << std::endl;
}
创建静态库:
$ g++ -c test.cpp
$ ar rvs libtest.a test.o
g++的参数说明:
- -c
表示只编译、汇编代码,不链接;
- rvs
表示创建静态库,并将编译好的文件 test.o 加入其中;
- libtest.a
表示库文件名。
编写调用静态库的测试程序:
// main.cpp
#include <iostream>
extern void foo();
int main() {
foo();
return 0;
}
编译可执行文件:
$ g++ main.cpp -L. -ltest -o main
g++的参数说明:
- -L.
表示库的路径为当前目录;
- -ltest
表示链接使用名为 libtest.a 的静态库文件;
- -o main
表示输出文件名为main。
2. 编译动态库
2.1 动态库介绍
动态库与静态库相反,它们不会被链接到可执行文件中,而是在可执行文件运行时动态地加载和链接。这样的好处是可以将库文件与可执行文件分开管理,使得程序运行时所需的资源更加灵活。
2.2 编译动态库的方法
编写样例程序如下:
// test.cpp
#include <iostream>
extern "C" void hello() {
std::cout << "Hello, world!" << std::endl;
}
编译动态库:
$ g++ -fPIC -shared test.cpp -o libtest.so
g++ 的参数说明:
- -fPIC
表示生成位置无关的目标文件(针对共享库文件);
- -shared
表示生成动态库;
- test.cpp
表示要编译的文件;
- -o libtest.so
表示生成的库文件名。
编写调用动态库的测试程序:
// main.cpp
#include <iostream>
#include <dlfcn.h>
typedef void (*hello_t)();
int main() {
void* handle = dlopen("./libtest.so", RTLD_LAZY);
if (handle == NULL) {
std::cerr << "Failed to open library." << std::endl;
return 1;
}
hello_t hello = (hello_t) dlsym(handle, "hello");
if (hello == NULL) {
std::cerr << "Failed to get symbol." << std::endl;
dlclose(handle);
return 1;
}
hello();
dlclose(handle);
return 0;
}
编译可执行文件:
$ g++ main.cpp -ldl -o main
g++ 的参数说明:
- -ldl
表示要链接动态链接库 dlopen、dlsym、dlclose 等函数。
3. 总结
通过上述两个例子,我们可以看到在 Linux 平台下使用 g++ 编译静态库与动态库的方法,以及对应的链接参数。在实际应用中,我们可以按照类似的方式来编译和链接自己的程序和库文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux下g++编译与使用静态库和动态库的方法 - Python技术站