在 Ubuntu 下用 C++ 调用“库文件”,一般分为两种情况:静态库(.a) 和 动态库(.so)。下面从「如何生成库」到「如何调用库」给你一个完整、实用的说明。
mylib.h#ifndef MYLIB_H
#define MYLIB_H
void hello();
int add(int a, int b);
#endif
mylib.cpp#include <iostream>
#include "mylib.h"
void hello() {
std::cout << "Hello from mylib!" << std::endl;
}
int add(int a, int b) {
return a + b;
}
main.cpp#include "mylib.h"
int main() {
hello();
std::cout << add(3, 4) << std::endl;
return 0;
}
g++ -c mylib.cpp -o mylib.o
ar rcs libmylib.a mylib.o
g++ main.cpp -L. -lmylib -o main
说明:
-L.:在当前目录找库-lmylib:链接 libmylib.a./main
g++ -fPIC -shared mylib.cpp -o libmylib.so
g++ main.cpp -L. -lmylib -o main
Ubuntu 默认不会在当前目录找 .so,需要指定路径:
export LD_LIBRARY_PATH=.
./main
或者:
LD_LIBRARY_PATH=. ./main
sudo cp libmylib.so /usr/local/lib/
sudo cp mylib.h /usr/local/include/
sudo ldconfig
g++ main.cpp -lmylib -o main
# 查看动态库依赖
ldd main
# 查看库中符号
nm libmylib.a
nm -D libmylib.so
cannot find -lmyliblibxxx.a / libxxx.so)-L路径error while loading shared librariesLD_LIBRARY_PATHsudo ldconfig如果库是 C 写的,C++ 调用要加:
extern "C" {
#include "mylib.h"
}
如果你有具体库名(如 OpenCV、Boost、第三方 SDK)或报错信息,可以直接发出来,我可以针对你的情况给命令。