【发布时间】:2021-07-08 16:08:10
【问题描述】:
我正在使用 XS 创建一个使用 C 库的 Perl 模块。
出于测试目的,我创建了一个具有两个简单功能的测试库:
void kzA() (做一个简单的 printf) void kzB(int i, char *str) (对接收到的参数进行 printf 处理)我还在 XS 中创建了一些胶水,以便现在访问 kzA() 函数: (我只展示了函数本身,但在 XS 中也有包含)
无效
K a()
代码:
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() 函数的测试脚本时,我得到了“before”行,但是 kzA () 函数显然没有被调用,因为它找不到 kzA 符号,程序停在那里。
创建一个 C 测试程序,我将使用相同的参数链接 (-l:fc.so -L/workspace/LirePivots)确实 工作,而且,只要我把路径在 LD_LIBRARY_PATH 中找到函数并正确运行。
我还尝试重命名库 libfc.so,并将 -l 部分更改为“-lfc”,但它也不起作用。它永远无法找到图书馆。
有谁知道我做错了什么?
编辑: 根据要求,我创建了一个最小示例:https://github.com/kzwix/xsTest 要运行它,您需要有一个带有 Perl 5 的 Linux 以及 XS(软件包 perl-devel,在 Redhat 上)。还有一个 C 编译器和 make,很明显。
【问题讨论】:
-
这是哪个操作系统?你能上传一个完整的最小例子吗? GitHub?
-
它在 Redhat Linux 上,它是一个容器,因为 /workspace 可以让您猜测。我们在我们的环境中使用 VSCode 和 Docker,但显然我很难为您提供完整的环境。
-
根据要求,我创建了一个 GitHub 存储库:github.com/kzwix/xsTest
-
我已添加two pull requests。使用这些 PR,我可以通过
test_module.pl脚本运行xsModule::ka()。我在 Ubuntu 21.04 -
见this答案