我用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
任何编译器都很容易组装,但总是给出相同的错误。
您正在不带参数调用
./example
,因此 argv[1]
是 NULL
。