我打算在linux上使用dlopen和dlsym来使这两个源文件工作:
#include <dlfcn.h>
#include <stdio.h>
int main()
{
int *(func)(void);
func=dlsym( dlopen("/home/noah/tmp/libmod.so.1", RTLD_LAZY), "func");
printf("%d\n", *func());
return 0;
}
和
int func()
{
return 42;
}
但是当我编译第一个时,它一直在说:
main.c:9:错误:左值作为赋值的左操作数
编辑:
我尝试添加一个演员,并使其成为一个函数指针,但现在它说:
main.c :(。text + 0x1f):对dlopen'
main.c:(.text+0x2b): undefined reference to
dlsym'
答案 0 :(得分:4)
您对func
的声明很困惑:
int *(func)(void);
相当于:
int *func(void);
所以你只是给编译器一个func
的原型而不声明一个变量;发生错误是因为函数不是有效的左值;但是,函数的指针是一个有效的左值,所以你需要这个:
int (*func)(void);
然后你的printf
应该是这样的:
printf("%d\n", func());
您还需要将dlsym
的回报转换为严格符合标准C:
func = (int (*)(void))dlsym(dlopen("/home/noah/tmp/libmod.so.1", RTLD_LAZY), "func");
void*
指针可以静默升级到除指向函数的指针之外的任何其他指针类型;例如,gcc -pedantic
将警告“ISO C禁止在没有强制转换的情况下在函数指针和'void *'之间进行分配”。我没有标准方便的副本(但这里肯定有人这样做)所以我不能引用章节和诗句,但咖啡馆在这一点上是正确的(感谢caf)。
您还要为cdecl.org添加书签。
答案 1 :(得分:0)
你不能真正做你正在尝试的事情
但它应该是int(func *)()
并且printf应该是func()
但你不能将dlsym及其所有参数指定为函数指针
提示....函数指针“func”只是一个指针,它没有状态,它只是一个内存地址
并且你不应该提供一个名为func的函数.....因为你正在创建一个名为func的指针。你可以创建一个函数“int test_function(){return 42;}
然后在main go func = test_function;只是用函数指针测试
答案 2 :(得分:0)