Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用dlopen动态加载共享库_C++_Dlopen_Dynamic Loading_Dlsym - Fatal编程技术网

C++ 使用dlopen动态加载共享库

C++ 使用dlopen动态加载共享库,c++,dlopen,dynamic-loading,dlsym,C++,Dlopen,Dynamic Loading,Dlsym,我正在尝试加载测试代码。所以使用dlopen。getNumber()是我想从TestCode.so中使用的函数。但是当我在加载时,所以。我不能使用这个功能。这就造成了分割错误 示例程序: TestHeader.hpp #ifndef _HEADER_HPP #define _HEADER_HPP typedef struct { int number; } Test; #endif TestCode.cpp #include "TestHeader.hpp" extern

我正在尝试加载测试代码。所以使用dlopen。getNumber()是我想从TestCode.so中使用的函数。但是当我在加载时,所以。我不能使用这个功能。这就造成了分割错误

示例程序: TestHeader.hpp

#ifndef _HEADER_HPP
#define _HEADER_HPP

typedef struct
{
        int number;
} Test;

#endif
TestCode.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);
}

有人能帮我理解这部分吗?提前感谢。

原因是您从未分配任何
测试对象。指针为
NULL
(使用
nullptr
),因此
tObj->number=number为UB,可能是segfault。
没有理由将
test
作为指针


测试tMainObj;getAge(&tMainObj,myAge)更简单,可以完成任务。

原因是您从未分配任何
测试对象。指针为
NULL
(使用
nullptr
),因此
tObj->number=number为UB,可能是segfault。
没有理由将
test
作为指针


测试tMainObj;getAge(&tMainObj,myAge)更简单,可以完成任务。

故障在哪里?您是如何编译库和代码的(哪些编译器、标志等)?为什么typedef返回
int
,而函数
void
?@OznOg,我在question@Quimby,谢谢你的注意。我已经纠正了在tObj->number=numberwhere是seg故障时仍然出现seg故障的问题?您是如何编译库和代码的(哪些编译器、标志等)?为什么typedef返回
int
,而函数
void
?@OznOg,我在question@Quimby,谢谢你的注意。我已经纠正了tObj->number=number@EmmaRoberts如果您愿意,您可以接受此答案,因此问题被标记为已回答。@Emma Roberts如果您愿意,您可以接受此答案,因此问题被标记为已回答。
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