QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 610|回复: 4

新手求救!!!

[复制链接]
发表于 2004-11-2 22:45:53 | 显示全部楼层 |阅读模式
我学习linux没多久,请高手指点一下
我自己编了一个.so文件,采用隐式调用的方法可以实现调用
但是使用显示调用时,编译总是出错,我觉得和书上写的没什么区别
代码如下:
#include "stdio.h"
#include "dlfcn.h"

void main()
{
void * m_handle=dlopen("../dll/libmydll.so",RTLD_LAZY);
void (*Message)();
if(!m_handle)
{
printf("load fail\n");
return 0;
}

Message= dlsym(m_handle,"Message");//14行
(*Message)();
dlclose(m_handle);
}

编译的的时候总是提示
testdll.cpp:14: cannot convert `void *' to `void (*) ()' in assignment
发表于 2004-11-3 01:54:57 | 显示全部楼层
gcc 3.2.2和gcc 2.96编译都能通过。
你把void (*Message)();改成void *(*Message)();试试
回复

使用道具 举报

 楼主| 发表于 2004-11-3 19:47:19 | 显示全部楼层
好的,我试一下,非常感谢
回复

使用道具 举报

 楼主| 发表于 2004-11-3 20:57:47 | 显示全部楼层
:-( 编译不通过的问题已经解决,但是执行的时候出现问题,
通过输出可以看出, dlsym返回的结果是0
但是,库文件中的接口应该是正确的,我用隐式方法调用成功了
以下是源代码,烦请版主帮忙!!

//mydll.cpp
#include <stdio.h>
void Message()
{
printf("\ntest dll ok\n");
return ;
}

gcc -shared -o libmydll.so mydll.cpp

//testdll.cpp
#include <stdio.h>
#include <dlfcn.h>
typedef void (*Message)();
void main()
{
void * m_handle=dlopen("../dll/libmydll.so",RTLD_LAZY);
Message message;
if(!m_handle)
{
printf("load fail\n");
return 0;
}
printf("load successful\n");
message=(Message)(dlsym(m_handle,"Message"));
printf("%d\n",message);
(*message)();
dlclose(m_handle);
}

gcc -o testdll testdll.cpp -ldl

显示的结果为
./testdll
load succeful
0
Segmentation fault (core dumped)
回复

使用道具 举报

发表于 2004-11-4 01:29:57 | 显示全部楼层
.cpp改成.c
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 03:43 , Processed in 0.047593 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表