我正在学习C ++。我现在试图在运行时链接库。我收到了细分错误错误。我不知道为什么会这样。 这是发生错误的cpp文件:
#include "CreateShape.h"
#include <dlfcn.h>
#include <iostream>
#include <sstream>
#include "Shape.h"
namespace six
{
typedef six::Shape* (*GET_OBJECT);
Shape* create_shape(const char* name)
{
Shape* shape = nullptr;
std::stringstream libName;
libName << "./lib" << name << ".so";
void* handle = dlopen(libName.str().c_str(), RTLD_LAZY);
if(handle == nullptr)
{
std::cout << "Could not open the library" << std::endl;
std::cout << "dlerror: "<< std::endl << dlerror() << std::endl;
exit(EXIT_FAILURE);
}
GET_OBJECT createShape = reinterpret_cast<GET_OBJECT>(dlsym(handle, "getNewShape"));
if(createShape == nullptr)
{
std::cout << "Could not find symbol getNewShape" << std::endl;
std::cout << "dlerror=" << dlerror() << std::endl;
dlclose(handle);
exit(EXIT_FAILURE);
}
return create_shape(name);
}
}
答案 0 :(得分:2)
该功能的精简版本是
Shape* create_shape(const char* name)
{
if(some_condition)
{
exit(EXIT_FAILURE);
}
if(some_other_condition)
{
exit(EXIT_FAILURE);
}
return create_shape(name);
}
可能您想返回在该函数中创建的shape
或某些Shape
。相反,您要做的是递归调用函数。停止递归的唯一方法是当您达到条件之一然后调用exit
时。
尽管,我不得不承认,为什么症状是我不太了解的段错误。
答案 1 :(得分:1)
您没有以正确的方式使用dl调用。从linux dlopen(3) man page
dlsym()
[...]由于符号的值实际上可以为NULL(因此从
dlsym()
返回的NULL不必表示错误),因此测试错误的正确方法是调用{{ 1}}清除所有旧的错误条件,然后调用dlerror()
,然后再次调用dlsym()
,将其返回值保存到变量中,并检查此保存的值是否不为NULL。