动态加载so

1:

libf1.so

 

#ifndef F1_HH_
#define F1_HH_

extern int func1(char *p);
#endif

 

#include <iostream>
using namespace std;

#ifdef __cplusplus

extern "C" {

#endif

int func1(char *p)
{
   if(p)
   {
        std::cout <<"func1: " ;
        std::cout <<p << endl;
   }
   return 1;
}

 

#ifdef __cplusplus

}

#endif

 

libf2.so

类似, 只是输出不同

 

2: 编译so

g++ f1.cpp -shared -fPIC -g -o libf1.so

g++ f2.cpp -shared -fPIC -g -o libf2.so

 

 

3: 应用程序

注册信号、动态加载;收到信号后重新加载

几个注意点:

a)  so的编译

b)  #ifdef __cplusplus ; 防止找不到符号。 so的编译器与应用程序的编译器保持一致

c)  g++ -rdynamic -lf1 -g -o test main.cpp -ldl 编译应用程序。 -lf1的意思是动态链接libf1.so     -ldl是为了使得可以动态加载libf2.so

4)  应用程序使用的so必需是通过符号链接到真实的so文件; 可以直接加载so,但是这种情况下so不能被修改(覆盖),覆盖时会程序core掉

在Linux系统下使用Qt5动态加载so库,可按以下步骤进行: ### 确认环境变量 新安装的Qt环境,需将Qt库目录添加到环境变量`LD_LIBRARY_PATH`,否则可能会导致加载`libQt5XcbQpa.so.5`等库时从最低优先级地方寻找,影响库的正常加载 [^1]。 ### 实现加载动态库的代码 可以通过`QLibrary`类来动态加载so库。以下是一个示例代码: ```cpp #include <QFile> #include <QLibrary> #include <QString> bool loadLibrary(const QString& appPath) { QLibrary *m_pLibTest; // 按照实际动态库所在的目录 QString strLibFile = appPath + "/dll/libtestDll.so"; if (QFile::exists(strLibFile)) m_pLibTest = new QLibrary(strLibFile); else { slotAppendText(strLibFile + " don't exists"); return false; } if(!m_pLibTest->load()) { QString strErrMsg = m_pLibTest->errorString(); slotAppendText(strLibFile + " load failed: " + m_pLibTest->errorString()); return false; } else return true; } ``` 在上述代码中,首先检查动态库文件是否存在,若存在则创建`QLibrary`对象并尝试加载,若加载失败则输出错误信息 [^2]。 ### 在应用中包含库路径 如果要在创建加载库的应用(如`QMainwindow`)中使用库,可在其头文件中包含库的路径。例如,若库名为`libtest.so`,可使用如下相对路径(需根据实际情况修改): ``` LIBS += -L./../libTest -ltest ``` 这里`-L`指定库的搜索路径,`-l`指定库名(去掉`lib`前缀和`.so`后缀) [^3]。 ### 加载输入法静态插件(可选) 若涉及输入法插件,输入法插件正常编译后会生成静态库,如`libfcitxplatforminputcontextplugin.a`,可直接在`CMakeList.txt`中使用`target_link_libraries()`加载 [^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值