设为首页 收藏本站
查看: 1809|回复: 0

Visual studio 2008下用SWIG包裹C/C++代码给Perl调用(Windows XP)

[复制链接]

尚未签到

发表于 2015-4-30 11:47:24 | 显示全部楼层 |阅读模式
  SWIG, Simplified Wrapper and Interface Generator, 简单来说是C/C++语言与其他语言的粘合剂 。
  官方站点:
  http://www.swig.org/
  http://www.swig.org/translations/chinese/tutorial.html
  
  介绍在Visual Studio 2008 下面如何用Swig制作DLL给Perl用(最后测试出现错误)。
  假如你有一个 example.c 的文件(官方站点上的例子):
  
  
     double Foo = 3.0;
  int gcd(int x, int y) {      
int g;        
g = y;        
while (x > 0) {        
g = x;        
x = y % x;        
y = g;        
}        
return g;        
}

    
  想把这个文件给Perl用。
  首先用Visual Studio 2008 建一个C++的win32 project工程,点击next后选择
  Application type: DLL(选择该项)
  Additional options: Empty project(选择该项)
  然后finish.
  把 example.c 的文件加入工程中source files。
  然后写一个接口文件 example.i :
  
  
     %module example      
%{        
extern int  gcd(int x, int y);        
extern double Foo;        
%}        
extern int  gcd(int x, int y);        
extern double Foo;

    
  把这个example.i文件加入工程中。
  注意%{ 和 %}之间的文字将原封不动的写入SWIG生成的wrap文件(example_wrap.c),相当于在wrap文件的函数声明。
  然后在系统中设置三个环境变量,主要是为了设置编译环境方便。
  如果Perl装在C盘。
  
     PERL5_INCLUDE=C:\Perl\lib\CORE      Perl的include文件夹     
PERL5_LIB=C:\Perl\lib\CORE\perl514.lib      Perl的静态库文件,可能根据版本不同而不同,我装的是5.14。
  SWIG=E:\software\swigwin-2.0.8\swigwin-2.0.8\swig.exe      swig.exe 的路径( 下载SWIG: http://www.swig.org/download.html )。
    环境变量设置完后需要重新启动 Visual Studio 2008 才有效。
  右击example.i,点击Properties中Custom Build Step
  设置Command line:
  
  
     echo In order to function correctly, please ensure the following environment variables are correctly set:      
echo PERL5_INCLUDE: %PERL5_INCLUDE%        
echo PERL5_LIB: %PERL5_LIB%        
echo on        
$(SWIG) -perl5 $(InputPath)

    
  和dos命令一样,最后一句相当于
  F:\Software\swigwin-2.0.8\swig.exe -perl5 example.i
  Outputs设置成$(InputName)_wrap.c 相当于example_wrap.c
  然后选择整个工程的Properties的Configuration Properties
  设置C/C++中General的Additional Include Directories: $(PERL5_INCLUDE)
  设置Linker中Input的Additional Dependencies: $(PERL5_LIB)
  然后编译。第一次编译后会生成example.pm,example_wrap.c。把example_wrap.c加入工程,再编译一次就ok了。把DLL拷贝到example.pm的目录里面,用 runme.pl 测试。
  
  
     #      
# Perl5 script for testing simple example

  use example;
  # Call our gcd() function
  $x = 42;      
$y = 105;        
$g = example::gcd($x,$y);        
print "The gcd of $x and $y is $g\n";

  # Manipulate the Foo global variable
  # Output its current value      
print "Foo = $example::Foo\n";

  # Change its value      
$example::Foo = 3.1415926;

  # See if the change took effect      
print "Foo = $example::Foo\n";

    
  测试结果:
  
     The gcd of 42 and 105 is 21      
Foo = 3        
Foo = 3.1415926

    -----------------------------------------------------------------
  最后测试的时候出现以下错误:
  F:\>perl runme.pl   
Can't locate loadable object for module example in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at example.pm line 11   
Compilation failed in require at runme.pl line 4.   
BEGIN failed--compilation aborted at runme.pl line 4.
  
  REF:
  http://www.swig.org/Doc1.3/Windows.html
  http://topic.iyunv.com/u/20090303/21/72a4fa1d-9146-4fc2-8555-8db2304d02df.html
  http://blogs.msdn.com/b/texblog/archive/2007/04/05/linking-native-c-into-c-applications.aspx
  http://blog.sina.com.cn/s/blog_48e3f9cd0100850k.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-62247-1-1.html 上篇帖子: Windows Server 2008磁盘清理工具 下篇帖子: Visual C++ 2008入门经典 第13章 使用MFC编写Windows程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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