linux下perl inline C调用动态链接库失败

linux下perl inline C调用动态链接库失败

linux AS4.0 update4系统
perl V5.8.5built for i386-linux-thread-multi
perl  InLine-0.44
perl脚本中实现对外部动态链接库函数的调用并返回值。使用定制的动态链接库my.so文件(/lib/my.so),使用my.h(/tmp/myTest.h),使用外部函数test并返回值.
perl源码test.pl如下:

#!/usr/bin/perl -w

use Inline (Config =>
                DIRECTORY => '/tmp/test',
               );
use Inline C => Config => LIBS => ' -lmy.so';
use Inline C => Config => INC  => '-I/tmp/';
use Inline C => Config => AUTO_INCLUDE => '#include "myTest.h"';
use Inline C => Config => ENABLE => AUTOWRAP;
use Inline C => <<'END_C';


#include <stdio.h>
#include <malloc.h>
#include <string.h>


void greet() {
  char * ret;
  ret=test(1,'ABC');

printf("test VerifyCert is ok!ret == %s\n",ret);
  
    }

END_C

greet;

myTest.h文件源码:

#ifndef MYTEST_H
#define MYTEST_H

#define USRNAME_LEN                             200             //用户名最大长度
#define RETURNVAL_LEN                           400             //返回值最大长度
#define FOPEN_FILE_ERR                          'm'             //打开文件失败


#ifdef __cplusplus
extern  "C" {
#endif

extern char*  TEST(int CertFlags,char* Cert);


#ifdef __cplusplus
}
#endif

#endif


执行test.pl时报错:
'/usr/bin/perl: symbol lookup error: /tmp/test/lib/auto/test_pl_ef8b/test_pl_ef8b.so: undefined symbol: test

不知是哪里出了问题,请大家帮忙看看。谢谢!
不会是就我吃这个螃蟹吧?难道真的是知音难觅
rm -fr _Inline/ 之后再试,如果还不行,先确定你的c程序用gcc ... -lmy.so可以编译通过。
删除了_Inline目录执行还是同样的错误。my.so直接从c的测试程序中调用正常,编译没有问题。是否是perl调用外部动态链接库还需要其它参数配置?

正好我这几天也用到了Inline,不过用的是Inline::CPP.
在实际使用过程中发现直接把C/C++中的语法拿来使用总会有很多问题.
我刚开始也是编译好了一个库文件放在perl程序中调用,但是问题和楼主的情况一样,总是得到undefined symbol的错误,
我正在尝试把需要编译的库文件直接用Inline::CPP来编写,出现错误再一点点调试.
虽然还没有完全调试完毕,但是进展还算顺利,呵呵.
希望有使用经验的同学共享一下经验.

Inline::Struct好像也有一些问题.不经过修改的Inline/Struct.pm同时只能识别出一个结构体.
结构体嵌套方面好像也有些问题,还在google中.
Inline相关的模块好像很长时间都没有过更新了.


QUOTE:
原帖由 richard_marx 于 2008-1-30 12:55 发表
use Inline C => Config => LIBS => ' -lmy.so';

这句改成
use Inline C => Config => MYEXTLIB => '/path/to/my.so';


试试看.
我不喜欢用 Inline。我喜欢用 XSub。
改为use Inline C => Config => MYEXTLIB => '/path/to/my.so';
效果依旧。现将我的动态链接库单独调试成功时写的C测试程序和makefile源码给大家看看:
C测试so库的源码:
main.cpp
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "caserverapi.h"

int main(int argc, char* argv[])
{
ret =
  VerifyCert(2,"MIIEYTCCAxxx");
  return 0;
}


makefile源码:

SHELL = /bin/sh


CC = gcc
LIBDIR    = -L./lib -lbaseder -lJZComm -lssl
all: libxxserverapi.so

clean:
    rm -f *.o *.so
xxserverapi.o: xxserverapi.cpp
    $(CC) -O -g -c    xxserverapi.cpp -I./
libxxserverapi.so: xxserverapi.o
    $(CC) -g -shared  -o libxxserverapi.so xxserverapi.o $(LIBDIR)  
main:main.cpp
    $(CC) -g -o test main.cpp  -lxxserverapi -lxxOCSQSclient -lmsg -lxxsocket
install:
    cp libxxserverapi.so lib/
    cp libxxserverapi.so /lib/

我的真实C接口需要以上的动态链接库,但是在perl源码中调用接口函数 VerifyCert(2,"MIIEYTCCAxxx")时提示这个方法undefined symbol

我的程序中对动态链接库中的方法是隐式调用的,是否通过显示调用可以解决undefined symbol的错误?有这么做过的朋友吗?
借人气问一下各位高手
用c++写好的dll文件 是否可以在perl脚本中调用呢?