问题讨论:程序 C/C++ Java GUI编程 ASP Php Shell Perl Web开发 软件工程 三大件 机箱 存储设备 光存储 音频设备 视频设备 外设 购机
asp php java C CGI .net vb delphi unix&linux sql Word Excel WPS OutLook Powerpoint Dreamweaver FPage/Golive CSS/HTML DOM/JS
热门词:流程图 excel 入侵检测 vss Windows 安全漏洞 QQ空间 事件编程 MFC

 程序设计交流 > C/C++ 

C/C++混合编程问题:感觉C++好费

[2007-8-10 11:21:39] [来源: 百家电脑学院] [我要投稿]

C/C++混合编程问题:感觉C++好费

我在主程序中加载插件,进行数据处理
[table=95%][tr][td][font=FixedSys][color=#0000cc]#include <dlfcn.h>

typedef void *atom;
typedef atom (*Element) (atom, char *);
...
...
Element
findSymbol (char *name)
{
  static void *plugin;
  plugin = dlopen ("./plugin", RTLD_NOW);
  if (plugin)
    {
      return dlsym (plugin, name);
    }
  printf ("%s", dlerror ());
  return NULL;
}[/color][/font][/td][/tr][/table]
当插件使用C编写时候没有任何问题,但是使用C++编写时,dlopen不能正确的解析符号,于是查找资料,看到这篇文章中提到了C++的“name mangling”(http://linux.web.cern.ch/linux/documentation/mirror/howto/C++-dlopen.html),发现在不得不在主程序中链接插件依赖的一些库,于是使用C++编译器编译主程序,结果出现有名的void*指针问题
[table=95%][tr][td][font=FixedSys]pipeline.c: In function ‘void* (* findSymbol(char*))(void*, char*)’:
pipeline.c:49: 错误:从类型 ‘void*’ 到类型 ‘void* (*)(void*, char*)’ 的转换无效[/font][/td][/tr][/table]
函数findSymbol不能通过编译,请高手指点

2007-8-1 12:44lenovo
强制转换一下?

2007-8-1 12:49jigloo
用c++编写插件是可以的,加个extern "c"

2007-8-1 17:19reiase
试过了,但不能解决所有问题,dlopen加载的时候会说有符号不能找到,找不到跟类有关的一个符号
解决方法是在主程序中包含那个类的定义,这样,主程序就只能用C++编译了

2007-8-1 17:37醉卧水云间
用C++写插件是没问题的,我都写了一大把。

2007-8-1 23:56reiase
那楼上能提示下吗,我用的dlfcn.h提供的dlopen来加载插件,C++编写的插件不能正确加载。LS是用什么实现的,谢谢

2007-8-2 09:31trublemaker
要加extern "C"吧

2007-8-2 10:08xiaomiao
头文件的函数声明中加入:
#ifdef _cplusplus
extern "C"
{
#endif

//... C风格函数原型声明

#ifdef _cplusplus
}
#endif

2007-8-2 10:27莫闲云
你把你的c++插件贴出来看一眼.

如果你把你的插件函数声明为extern "C"就不会有问题.

2007-8-2 12:42reiase
插件的代码
[table=95%][tr][td][font=FixedSys][color=#0000cc]#include <stdio.h>
#include <stdlib.h>
#include <Magick++.h>
using namespace Magick;
typedef Image* atom;
#include "plugin.h"
#include "core.h"

extern "C"
Image*
Iread (Image * x, char *arg)
{
    Image *image= new Image();
    image->read(arg);
    return image;
}
[/color][/font][/td][/tr][/table]
编译命令
gcc  test.cpp core.c -shared -o plugin -rdynamic -g `Magick++-config --cppflags --cxxflags --ldflags --libs`
完整的源代码(包含makefile)在这里http://reiase.googlepages.com/Ein02.tar.gz
程序主要是为了提供一个能够在运行时可配置的数据处理程序的框架,能够很快很容易得添加功能,还要比较小,不想嵌入一个很大很专业的解释器

2007-8-2 12:45reiase
我这里使用C++插件时出现的错误,一个符号不能解析,跟类有关的一个符号
[table=95%][tr][td][font=FixedSys]>>Iread im.png
/usr/lib/libMagick++.so.10: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE段错误
[/font][/td][/tr][/table]
感谢楼上各位

2007-8-2 12:59莫闲云
c++链接时, 一定要用g++.
或者指明链接stdc++库.

2007-8-2 13:37reiase
链接stdc++后问题解决了,谢谢

·C/C++混合编程问题:感觉C++好费 | 相关文章·

·百家学院 | 最新评论·