显式动态库的问题

问题描述 投票:0回答:1

我用C++编写了一个动态库random.so,其中包含一个rand_int函数,可以生成给定范围内的数字。我隐式连接了我的库(通过包含“../shared/rand.h”)并且一切正常,但是当显式连接时,我收到错误“fish:作业1,'./example'被信号SIGSEGV终止(地址边界错误) )”,下面是我的程序和库的代码。

// example.cpp
#include <cstdio>
#include <dlfcn.h>

int main(int argc, char *argv[]) {
  void *ext_library;
  int (*rand)(int, int);

  ext_library = dlopen("/home/nikita/Libraries/shared/librandom.so", RTLD_LAZY);
  if (!ext_library) {
    fprintf(stderr, "dlopen() error: %s\n", dlerror());
    return 1;
  }

  rand = (int (*)(int, int))dlsym(ext_library, argv[1]);

  printf("%d", (*rand)(0, 10));

  dlclose(ext_library);
  return 0;
}
// random.cpp
#include <random>
int rand_int(int min, int max) {
  std::random_device rd;
  std::mt19937 gen(rd());
  std::uniform_int_distribution<int> dist(min, max);
  return dist(gen);
}
// random.h
int rand_int(int min, int max);

random.cpp
random.h
位于我的“shred”文件夹中,而
example.cpp
位于“lb”文件夹中,2个这些文件夹位于同一目录中。
example.cpp
我是使用这个命令进行编译的:

g++ example.cpp -o example -ldl

然后我用命令

./example
启动了它。然后我使用命令 ./example 运行它,之后出现错误“fish: Job 1, './example' 被信号 SIGSEGV(地址边界错误)终止”

我尝试将编译器更改为 clang,但没有帮助,

example.cpp
任何编译器都很容易组装,但总是给出相同的错误。

c++ linux dll g++ shared-libraries
1个回答
0
投票

您正在不带参数调用

./example
,因此
argv[1]
NULL

© www.soinside.com 2019 - 2024. All rights reserved.