【问题标题】:Deploying C app that uses the PCRE library部署使用 PCRE 库的 C 应用程序
【发布时间】:2010-11-23 13:14:49
【问题描述】:

我编写了一个使用 PCRE 库的 C 应用程序。一切都在我自己的电脑上运行。但是,当我将二进制文件复制到另一台计算机并运行它时,会出现以下错误:

/libexec/ld-elf.so.1:找不到共享对象“libpcre.so.0”,“myapp”需要

我知道我可以通过在目标计算机上安装 PCRE 库来使其工作。但是,我想知道是否有更方便的方法来做到这一点? (只是复制几个 lib 文件?)

我试图复制 libpcre.so.0 文件,但没有成功。

感谢任何帮助! 谢谢,

【问题讨论】:

    标签: c deployment pcre


    【解决方案1】:

    正如@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?)。

    【讨论】:

    • 静态编译似乎最适合我的情况,因为我在目标计算机上没有 root 权限。但是,我无法使编译行正常工作。我包含了 -static 标志并摆脱了 lpcre 但现在它找不到 lib 文件(给我一堆 pcre 函数作为未定义的错误)。
    • 尝试将 -lpcre 替换为 /usr/lib/libpcre.a(或您的 libpcre.a 所在的任何位置)
    • 当 Jonathan 谈到避免使用 -lpcre 时,他当然不是指在没有适当替换的情况下将其删除。
    • 您的构建机器上是否真的有一个静态 PCRE 库。您可能不会 - 因此出现“找不到库”错误。而且,很可能,PCRE 的默认构建只构建共享库。 (话虽如此,PCRE 5.0 - 大约 2004 年 - 默认为静态库和共享库。)
    • 我在 /usr/local/lib 中有 libpcre.a
    【解决方案2】:

    您应该能够复制它,然后将 envvar LD_LIBRARY_PATH 设置为它所在的文件夹,或者甚至创建一个设置此 envvar 的 shell 脚本,然后按如下方式启动您的程序

    LD_LIBRARY_PATH=. ./your_program
    

    查看Program Library How To

    【讨论】:

    • 是的,这是一种可能的方式。但是静态编译它似乎更适合我的情况
    【解决方案3】:

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

    【讨论】:

    • 如何静态链接pcre?我很不擅长编译 c/c++
    • 有很多方法。您可以静态链接整个想法,将-static 选项提供给gcc,或者您可以指定libpcre.a 库而不是-lpcre(或命令行中的任何内容)。实际上,这取决于您的构建机器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多