如何告诉MakeMaker添加我想要的库



我正在使用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,它们链接到我的组织内部的图像,我不允许共享(

相关内容

  • 没有找到相关文章

最新更新