部署使用PCRE库的C应用程序

3
我编写了一个使用PCRE库的C应用程序。在我的电脑上一切正常。但是,当我将二进制文件复制到另一台计算机上并运行它时,会出现以下错误:
/libexec/ld-elf.so.1: 找不到共享对象“libpcre.so.0”,需要“myapp”
我知道我可以通过在目标计算机上安装PCRE库来使其工作。但是,我想知道是否有更方便的方法?(只需复制几个lib文件?)
我尝试复制libpcre.so.0文件,但它没有起作用。
感谢任何帮助! 谢谢,
3个回答

2

最好的做法是将其安装或静态链接。当然,前者对资源更加轻量级。确保兼容性的最佳方法是为目标系统构建软件包,指定所有依赖项(这取决于发行版)。


我该如何静态链接pcre呢?我在编译c/c++方面很糟糕。 - Dave
有几种方法。您可以静态链接整个程序,向gcc提供-static选项,或者您可以指定libpcre.a库而不是-lpcre(或者在您的命令行中是什么)。实际上,这取决于您的构建机制。 - Michael Krelin - hacker

2
如@hacker所说,您需要确保在目标计算机上安装PCRE或在开发计算机上使用静态库(libpcre.a而不是libpcre.so)。这可能意味着您需要使用静态库构建PCRE,并且必须使用正确的编译时选项来引入静态库。一个相对简单的方法是在编译器命令行中指定/usr/lib/libpcre.a。理想情况下,您应该避免在命令行中包含-lpcre - 当然,您希望静态库出现在共享库之前。
您的复制过程可能因符号链接问题而失败。通常,您会链接到一个文件,例如:
/usr/lib/libpcre.so

但这是一个符号链接,指向一个版本化的库,例如:

/usr/lib/libpcre.so.0

或者反过来也可以。如果你使用tar进行复制,你可能会复制符号链接。

理想情况下,你应该将PCRE安装在系统目录中,但这需要root权限。你还要小心确保不要用旧版本覆盖更高版本的PCRE。你也要避免强制用户设置LD_LIBRARY_PATH环境变量(或其等效物),或强制他们使用配置程序(ld.so.conf?)。


尝试将 -lpcre 替换为 /usr/lib/libpcre.a(或者您的 libpcre.a 所在位置)。 - Michael Krelin - hacker
错误信息类似于“对`pcre_fullinfo'的引用未定义”。 - Dave
PCRE 的当前版本是 7.3(5.0 已经过时了)...它默认构建静态和共享库。但是,您可能需要实际安装它。 - Jonathan Leffler
请尝试使用 $(CC) $(CFLAGS) -o $@ $^ /usr/local/lib/libpcre.a - Michael Krelin - hacker
是的 =)那就是解决方案。lib文件需要放在.c文件之后。谢谢! - Dave
显示剩余7条评论

0

你应该能够复制它,然后将 envvar LD_LIBRARY_PATH 设置为它所在的文件夹,甚至可以创建一个 shell 脚本来设置这个 envvar,然后启动你的程序,如下所示

LD_LIBRARY_PATH=. ./your_program

请查看程序库使用说明


是的,这是一种可能的方法。但在我的情况下,静态编译似乎更理想。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接