使用 dlopen 动态加载共享库

2024-01-23

我正在尝试使用 dlopen 加载 TestCode.so。 getNumber() 是我想从 TestCode.so 使用的函数。但是当我加载 .so 时。我无法使用该功能。它给出了分段错误。

示例程序: 测试头.hpp

#ifndef _HEADER_HPP
#define _HEADER_HPP

typedef struct
{
        int number;
} Test;

#endif

测试代码.cpp

#include "TestHeader.hpp"

extern "C" void getNumber( Test* tObj, int number)
{
        tObj->number = number;
}

main.cpp

#include "TestHeader.hpp"
#include <iostream>
#include <dlfcn.h>
#include <stdio.h>
int main() {
        using std::cout;
        using std::cerr;
        Test* tMainObj = NULL;    
        typedef int (*TestNumber)(Test*, int);

        void* thandle = dlopen("./TestCode.so", RTLD_LAZY);
        if (!thandle) {
                cerr << "Cannot load TestCode: " << dlerror() << '\n';
                return 1;
        }

        // reset errors
        dlerror();

        // load the symbols
        TestNumber getAge = (TestNumber) dlsym(thandle, "getNumber");
        const char* dlsym_error = dlerror();
        if (dlsym_error) {
                cerr << "Cannot load symbol getNumber: " << dlsym_error << '\n';
                return 1;
        }
        printf("Getting my age\n");
        int myAge = 25; 
        getAge(tMainObj,myAge);
        printf("My age from the so is: %d\n",tMainObj->number);

        dlclose(thandle);
}

Output:

获取我的年龄分段错误(核心已转储)

用于编译和创建共享库。我使用以下命令,

g++ -fPIC -c -Wall TestHeader.hpp
g++ -fPIC -c -Wall TestCode.cpp 
g++ -shared TestCode.o -o TestCode.so
g++ -fPIC -c -Wall main.cpp
g++ main.cpp -o main TestCode.o -ldl

谁能帮我理解这部分?提前致谢。


原因是你从来没有分配任何Test目的。指针是NULL(use nullptr), so
tObj->number = number;是 UB 并且可能是段错误。 没有理由test成为一个指针。

Test tMainObj;getAge(&tMainObj,myAge);更简单并且可以完成工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dlopen 动态加载共享库 的相关文章

随机推荐

  • 将参数添加到 @keyframes 属性 Less

    我有一处房产 keyframes 我用autoprefixer编译来添加所需的前缀 我想做的是向动画名称 或任何可能的地方 添加一个参数 以将属性值更改为关键帧键 这就是我现在所拥有的 keyframes loader 0 transfor
  • Node.js Express 模块未正确加载

    Geos Mac hone georgiana npm list Users georgiana local hone email protected cdn cgi l email protection email protected c
  • (Z3Py) 函数声明有什么限制吗?

    函数声明有什么限制吗 例如 这段代码返回 unsat from z3 import def one op op arg1 arg2 if op 1 return arg1 arg2 if op 2 return arg1 arg2 if o
  • 如何让PHP使用代理设置来连接互联网?

    我位于不允许直接连接到互联网的代理服务器后面 我的所有 PHP 应用程序都无法连接到互联网进行更新检查等 我如何告诉 PHP 我的代理设置 我不想在代码中输入代理设置 我希望 PHP 本身通过全局配置设置或类似的东西使用它 如果几乎所有人的
  • 根据类中的变量对类向量进行排序[重复]

    这个问题在这里已经有答案了 我有一个类 其中有一个类型变量int储存在里面 然后我创建了一个向量 其中包含此类 然后我需要对其进行排序 然而 我的问题源于这样一个事实 我需要使用此类中存储的 int 值按升序对向量进行排序 我看过std s
  • 羽毛可以与羽毛外部管理的路线共存吗

    我们有一个大型应用程序 它使用 Express 进行休息 使用 primus 进行套接字路由 一下子全部变成羽毛是非常困难的 我正在考虑分阶段的方法 我可以采用一些路线并将它们转换为服务 因此任何新路线都将遵循服务模式 我将慢慢迁移应用程序
  • 如何处理文件路径中的空格

    我在使用以下脚本时遇到问题 我正在检查的文件路径中的空格似乎让我感到震惊 关于如何不让 PoweShell 崩溃的任何想法 Program Files x86 GC C server txt server if Test Path serv
  • 如何将数组类型作为泛型类型参数传递给 VHDL 包?

    我正在 VHDL 2008 中开发通用包 列表 该包具有元素类型的泛型类型 如果我在包中声明此元素类型的数组类型 那么它就是一个新类型 所以对于例如整数 我的新整数数组将与 ieee 库中的整数向量不兼容 所以我还需要传入数组类型 例如in
  • Pyspark:从 blob 存储加载 zip 文件

    我正在使用 Pyspark 尝试从 blob 存储中读取 zip 文件 我想在加载后解压缩文件 然后将解压缩的 CSV 写回 Blob 存储 我正在遵循此指南 该指南解释了如何在阅读后解压缩文件 https docs databricks
  • 我们可以从oracle10g程序中执行unix命令吗

    unix机器上的oracle10g 我需要在程序中执行unix命令 我该怎么做 BEGIN DBMS SCHEDULER create job job name gt SHELL JOB repeat interval gt FREQ DA
  • NGINX 将路径作为变量发送给 PHP,除非路径是文件路径

    我想将所有路径传递给index php page path 例如 domain com a b c gt index php page a b c 因此这是我的 NGINX conf 文件 location P
  • 代理似乎被 Mechanize 忽略了?

    我正在使用 http 代理和 Mechanize 模块 我初始化 mechanize 对象并设置代理 如下所示 self br mechanize Browser self br set proxies http proxyAddress
  • HTML 表单操作 method="POST" 还是 method="post"? [复制]

    这个问题在这里已经有答案了 使用非大写的 post 或大写的 POST 有什么区别吗
  • 无法将自定义转换器添加到 log4j

    下列的here http logging apache org log4j 2 x manual extending html PatternConverters 我想延长log4j通过自定义转换器 将 shiro 用户名添加到日志中 这是
  • 链接影响不同元素的 jQuery 动画

    document ready function div1 fadeIn slow div2 delay 500 fadeIn slow div3 delay 2000 fadeIn slow div4 delay 8000 fadeIn s
  • Mediatr:减少 DI 对象的数量

    我有很多命令和查询 其中大多数需要相同的接口来完成不同的事情 是否有可能如何减少我的每个处理程序都需要的这种混乱 并且一遍又一遍地重复 public class GetCoinByIdQueryHandler IRequestHandler
  • 使用 SOAP,还是不使用 SOAP?就是那个问题

    我有 3g 手机协议栈的背景 现在我需要从 Android 平板电脑与服务器进行通信 我将对接口的两侧进行编码 更新 我应该说 从 Android 多个 slate 到本地服务器 多个 然后通过卫星到单个中央主服务器 现在我想我可能不会实施
  • 生成日期范围的数据,包括数据中不存在的日期

    这是我的表结构和数据 CREATE TABLE event EventID INT 11 NOT NULL AUTO INCREMENT EventDate DATETIME DEFAULT NULL Description VARCHAR
  • 使用projectile在.dir-locals中设置flycheck-clang-include-path

    尝试设置 Flycheck clang include path 而无需包含项目的完整路径 包括使用弹丸的目录 但我收到错误 所以这有效 nil company clang arguments home user Downloads pro
  • 使用 dlopen 动态加载共享库

    我正在尝试使用 dlopen 加载 TestCode so getNumber 是我想从 TestCode so 使用的函数 但是当我加载 so 时 我无法使用该功能 它给出了分段错误 示例程序 测试头 hpp ifndef HEADER