链库与使用
在上一篇中,我们已经生成了头文件与库文件,接下来我们写个测试程序链库验证下。
测试代码如下:
#include "hv/hv.h"
int main() {
char exe_filepath[MAX_PATH] = {0};
char run_dir[MAX_PATH] = {0};
// 获取hv编译版本
const char* version = hv_compile_version();
// 获取可执行文件路径
get_executable_path(exe_filepath, sizeof(exe_filepath));
// 获取运行目录
get_run_dir(run_dir, sizeof(run_dir));
printf("exe_filepath=%s\n", exe_filepath);
printf("run_dir=%s\n", run_dir);
// 写日志
LOGI("libhv version: %s", version);
return 0;
}
编译运行:
$ cc -std=c99 test.c -o test -lhv
$ ./test
exe_filepath=/home/hw/github/libhv/test
run_dir=/home/hw/github/libhv
$ cat libhv*.log
2021-02-06 00:16:40.989 INFO libhv version: 1.21.1.31 [test.c:19:main]
注:如在linux上遇到找不到库错误,请先确保是否已通过sudo make install
安装过了,然后再执行sudo ldconfig
刷新下链接库查找缓存,通过sudo ldconfig -p | grep libhv
查看是否正确安装且能被链接器找到。
完整的编译->安装->检查
步骤如下:
$ cd libhv
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
$ sudo ldconfig -p | grep libhv
libhv.so (libc6,x86-64) => /usr/local/lib/libhv.so
如果安装到/usr/local
目录下执行ldconfig
后还是无法找到(一般是centos
系统没有将/usr/local/lib
目录加到ld.so.conf
里),可以指定安装目录
./configure --prefix=/usr
make
sudo make install
如果你想链接使用当前代码目录lib下的库,而不是/usr/local/lib
系统目录下的,可通过设置LD_LIBRARY_PATH
环境变量来控制。
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
windows链库说明
cmake生成vs工程,打开hv.sln
编译后会生成头文件include/hv
、静态库lib/hv_static.lib
和动态库lib/hv.dll
,所以有动态库和静态库两种链库方式。
动态导入库hv.lib + 动态库hv.dll
工程 => 属性 => Linker => Input => Addtional Dependencies 加hv.lib
或代码里添加
#pragma comment(lib, "hv.lib")
静态库声明宏HV_STATICLIB + 静态库hv_static.lib
工程 => 属性 => c/c++ => 预处理器 => 预处理器定义中添加HV_STATICLIB
预编译宏,以屏蔽hexport.h
头文件中动态库导入宏
#define HV_EXPORT __declspec(dllimport)
工程 => 属性 => Linker => Input => Addtional Dependencies 加 hv_static.lib
或代码里添加
#pragma comment(lib, "hv_static.lib")
Tips:
hv.lib
是动态库的导入库,hv_static.lib
是静态库,即所有.obj
文件的archive归档,这两个库链接其一即可,如果选择链接静态库,才需要添加HV_STATICLIB
预编译宏。