gpt4 book ai didi

无法在运行时加载共享库

转载 作者:行者123 更新时间:2023-12-02 08:42:47 24 4
gpt4 key购买 nike

foo.h

#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif

foo.c

#include <stdio.h>
#include "foo.h"
void foo(void)
{
puts("Hello, I'm a shared library");
}

编译使用

gcc -Wall -fPIC -c foo.c
gcc -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

动态.c

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
typedef void (*foo)(void);
int main(int argc, char* argv[])
{
void* lib;
foo df;
printf("argc: %d\n",argc);
if(argc < 2)
return printf("USAGE: %s lib-file\n", argv[0]);

lib = dlopen(argv[1], RTLD_NOW);
if(lib == NULL)
return printf("ERROR: Cannot load library\n");

df = dlsym(lib, "foo");
if(df)
{
df();
}
else
printf("ERROR: Invalid library\n");
dlclose(lib);
}

编译使用:

gcc -rdynamic -o dyna dyna.c -ldl

运行:

./dyna libfoo.so
argc: 2
ERROR: Cannot load library

我不明白我哪里错了...

最佳答案

仔细阅读dlopen(3)手册页。

 If filename contains a slash ("/"), then it is interpreted as a
(relative or absolute) pathname. Otherwise, the dynamic linker
searches for the library as follows:

所以你应该跑

 ./dyna ./libfoo.so

 ./dyna $PWD/libfoo.so

或者您可以将 LD_LIBRARY_PATH 设置为包含 .(不推荐)

附言不要忘记使用 dlerror() 进行错误报告,并记住 dlopen 可能不可重入(因此如果您有一个多线程应用程序,请序列化使用一些互斥量调用 dlopendlsym

关于无法在运行时加载共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com