分段错误(核心已转储)-不知道为什么

时间:2019-11-08 14:55:02

标签: c++

我正在学习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);
}
}

2 个答案:

答案 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。