Linux qtcreator编程实现动态加载动态链接库

简介: Linux qtcreator编程实现动态加载动态链接库

完整的工程源码可以访问下载:http://download.csdn.net/download/libaineu2004/9896700

一、主程序main.cpp

#include <iostream>
#include <dlfcn.h>
using namespace std;
typedef int (*pStrLenFun)(char *str);
typedef char *(*pStrCopyFun)(char *desc, char *src);
int main(int argc, char *argv[])
{
    char src[]="Hello Dymatic";
    char desc[80];
    pStrLenFun fun1;
    pStrCopyFun fun2;
    void *phandle = NULL;
    char *perr = NULL;
    phandle = dlopen("libslstrlen.so", RTLD_LAZY);//RTLD_NOW
    if(!phandle)
    {
        printf("Failed Load library!\n");
    }
    perr = dlerror();
    if(perr != NULL)
    {
        printf("%s\n",perr);
        return 0;
    }
    fun1 = (pStrLenFun)dlsym(phandle, "StrLen");
    perr = dlerror();
    if(perr != NULL)
    {
        printf("%s\n",perr);
        return 0;
    }
    fun2 = (pStrCopyFun)dlsym(phandle, "StrCopy");
    perr = dlerror();
    if(perr != NULL)
    {
        printf("%s\n",perr);
        return 0;
    }
    printf("The string is: %s\n",src);
    printf("the string length is: %d\n",fun1(src));
    printf("the string copyed:%s\n",fun2(desc,src));
    return 0;
}
————————————————
版权声明:本文为CSDN博主「libaineu2004」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/libaineu2004/article/details/75035946

相应的go.pro文件

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
DESTDIR = ../bin
QMAKE_LFLAGS += -ldl #编译选项,否则会失败。comile option,dlopen()
#如果程序员想在QtCretor直接运行并动态加载动态库的话,则需要添加好该库,否则会报错。
#Failed Load library!
#libslstrlen.so: cannot open shared object file: No such file or directory
LIBS += -L../bin/ -lslstrlen
SOURCES += main.cpp

二、动态库

源文件slstrlen.cpp

#include "slstrlen.h"
#define ENDSTRING '\0'
int StrLen(char *string)
{
  int len = 0;
  while(*string++ != ENDSTRING)
    len++;
  return len;
}
char *StrCopy(char *desc, char *src)
{
    return 0;
}

头文件slstrlen.h

#ifndef SLSTRLEN_H
#define SLSTRLEN_H
#include "slstrlen_global.h"
//如果动态库使用g++编译,那么动态库定义函数的时候加上extern "C",否则会提示undefined symbol错误。
extern "C" int SLSTRLENSHARED_EXPORT StrLen(char *string);
extern "C" char * SLSTRLENSHARED_EXPORT StrCopy(char *desc, char *src);
#endif // SLSTRLEN_H

头文件slstrlen_global.h

#ifndef SLSTRLEN_GLOBAL_H
#define SLSTRLEN_GLOBAL_H
//#include <QtCore/qglobal.h>
#define Q_DECL_EXPORT     __attribute__((visibility("default")))
#define Q_DECL_IMPORT     __attribute__((visibility("default")))
#define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
#if defined(SLSTRLEN_LIBRARY)
#  define SLSTRLENSHARED_EXPORT Q_DECL_EXPORT
#else
#  define SLSTRLENSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // SLSTRLEN_GLOBAL_H

slstrlen.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2017-07-12T14:58:54
#
#-------------------------------------------------
QT       -= core gui
TARGET = slstrlen
TEMPLATE = lib
DESTDIR = ../bin
DEFINES += SLSTRLEN_LIBRARY
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += slstrlen.cpp
HEADERS += slstrlen.h\
        slstrlen_global.h
unix {
    target.path = /usr/lib
    INSTALLS += target
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
23天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
85 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
100 6
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
142 3
|
2月前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
39 0
|
3月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
53 1
|
3月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
3月前
|
网络协议 Linux Shell
探索Linux操作系统:从基础到高级编程
【8月更文挑战第31天】本文旨在为读者提供一条清晰的路径,从Linux操作系统的基础知识出发,逐步深入到高级编程技巧。我们将一起揭开Linux神秘的面纱,了解其内部工作原理,并通过实际代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你带来新的视角和技能提升。
下一篇
无影云桌面