调用动态库中的函数
main.cpp
#include <iostream>
#include "libTest.h"
using namespace std;
int main()
{
cout << "Hello World!" << endl;
printHello();
return 0;
}
生成的库文件是chooseLib
.pro
LIBS += -llibTest
libTest.h 和libTest.cpp
libTest.h
#ifndef LIBTEST_H_
#define LIBTEST_H_
void printHello();
#endif
libTest.cpp
#include "libTest.h"
#include <iostream>
using namespace std;
void printHello()
{
cout<<"0004 version Hello"<<endl;
}
CMakeList.txt
cmake_minimum_required(VERSION 3.5)
project(libTest LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#add_executable(libTest main.cpp)
add_library(libTest SHARED libTest.cpp)
将liblibTest.so分别放入系统库目录/usr/lib下和chooseLib所在目录的lib下。在终端中查看chooseLib的访问路径.
$ldd chooseLib
linux-vdso.so.1 (0x00007ffff73fa000)
liblibTest.so => /lib/liblibTest.so (0x00007f4f87e56000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f87c74000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4f87a82000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4f87933000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4f87e85000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f87918000)
liblibTest.so的访问路径是lib(与/usr/lib是同一个目录)。
然后我输入了命令:
$LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zcm/projects/build-chooseLib-Desktop_Qt_6_3_2_GCC_64bit-Debug/lib
$export LD_LIBRARY_PATH
两句是设置chooseLib的访问库路径,第二句不能缺。
然后再看chooseLib的访问路径
$ldd chooseLib
linux-vdso.so.1 (0x00007ffd303d6000)
liblibTest.so => /home/zcm/projects/build-chooseLib-Desktop_Qt_6_3_2_GCC_64bit-Debug/lib/liblibTest.so (0x00007f1bea2e5000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1bea0e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1be9eee000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1be9d9f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1bea2f1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1be9d84000)
可以看到liblibTest.so的路径变了。
用处:
发布程序时,可能程序依赖的库文件在新环境中有同名的,这时需要指定访问哪个库,通常是指定到发布程序自带的库,这样可以避免因版本不对导致的错误。