我正在使用XS创建一个使用C库的Perl模块。
出于测试目的,我创建了一个测试库,它有两个简单的函数:
void kzA(((进行简单的打印(void kzB(int i,char*str((打印收到的参数(
我还在XS中创建了一些胶水,以便访问kzA((函数:(我只展示了函数本身,但XS中也有包含(
无效ka((代码:printf("kzA((之前\n"(;kzA((;printf("kzA((之后\n"(
因此,我将测试库编译为fc.So,它与我的xs文件和Makefile.PL(/workspace/LirePivots(位于同一目录中
在我的Makefile.PL中,我将LIBS键设置为"-L/workspace/LirePivots-L:fc.so",但当用perl(perl-Makefile.PL(执行它时,它会说";警告(基本无害(:找不到-l:fc.so"的库;然后,它编写一个Makefile,其中没有提到所述库。然后,在编译(使用"make"(和安装(使用"sudo make install"(之后,当我运行从我的模块调用ka((函数的测试脚本时,我得到行";在"之前";,但很明显,kzA((函数没有被调用,因为它找不到kzA符号,程序到此为止。
创建一个C测试程序,我将使用相同的参数(-l:fc.so-l/workspace/LirePivots(链接该程序,这确实起到了的作用,而且,只要我将路径放在LD_LIBRARY_path中,它就会找到函数并正确运行。
我还尝试将库重命名为libfc.so,并将-l部分更改为"-lfc";,但也没用。它从来没有找到图书馆。
有人知道我做错了什么吗?
编辑:根据要求,我创建了一个最小的示例:https://github.com/kzwix/xsTest要运行它,您需要有一个带有Perl5和XS(Redhat上的Perl-devel包(的Linux。还有一个C编译器,很明显还有make。
好吧,我仍然不知道它找不到库的原因。但我找到了一个变通办法:
通过将测试库添加为";libfc.so";到/usr/lib,然后运行"sudo ldconfig";,这个库被添加到了缓存中(当命名为fc.so时,即使在/usr/lib中,ldconfig也会而不是添加它。此外,它也不能与符号链接一起工作,我必须真正将它复制到那里(。
在库被添加到高速缓存之后;perl Makefile.PL";仍然无法找到库。我不得不使用"-L/usr/lib";除了"-lfc";它终于找到了图书馆;同意";以将参数添加到库的链接步骤。
在这之后,我可以用";make";,并且执行测试程序确实按照最初的意图工作(我看到了printf的"before"one_answers"after",我看到了libfc.so的kzA((函数中的函数(
感谢Håkon Hægland的帮助。
(我无法提供Dockerfiles,它们链接到我的组织内部的图像,我不允许共享(