【问题标题】:Making strlcpy available in linux使 strlcpy 在 linux 中可用
【发布时间】:2020-09-11 20:54:46
【问题描述】:

我正在尝试编译最初为 FreeBSD 编写的源代码,并且由于 strlcpy isn't included in the linux GlibC ,我现在在这个阶段停止了。

GCC 建议我可以使用strncpy,但我不想实际更改源代码。

我需要重新编译我的 LibC 吗?

感谢任何帮助。

【问题讨论】:

  • 您是否包含正确的标题? linux.die.net/man/3/strlcpy
  • @KamilCuk 问题出在这里:在 BSD 中,“#include ”中的“bsd/”部分是不必要的(实际上是禁止的)。但我没有 BSD 版本的 string.h 。所以我正在寻找一种安装它的方法。
  • 那么我在哪里可以找到 string.h 的 BSD 版本并将其放在某个地方,最后在 makefile 的“CFLAGS”中添加一些标志?
  • 你没有/usr/include/bsd/string.h吗?然后使用您的 linux 分发包管理器安装它们。在我的 archlinux 上,它归 extra/libbsd 包所有。
  • @ParsaMousavi:您可以使用apt-file 找出哪个(卸载的)包包含文件。它非常有用。 apt-file search /usr/include/bsd/string.h 报告该文件在包中 libbsd-dev,正如 Ismael 的回答所说。

标签: linux gcc freebsd glibc


【解决方案1】:

您可以从https://github.com/freebsd/freebsd/blob/master/sys/libkern/strlcpy.c 下载源代码并在您的源代码中添加两处修改:

$ diff strlcpy.c strlcpy.c.orig 
20c20
< //__FBSDID("$FreeBSD$");
---
> __FBSDID("$FreeBSD$");
23c23
< //#include <sys/libkern.h>
---
> #include <sys/libkern.h>

我已经在 Ubuntu 18.04 上使用 gcc 7.5.0 成功编译了这个函数。

【讨论】:

  • 我也使用 ubuntu 18.04 服务器和 gcc 7.5。谢谢。
【解决方案2】:

移植BSD应用程序的最佳解决方案是libbsd;它已经为大多数系统打包。

在基于 Debian 的系统上,开发包被命名为 libbsd-dev

您可以通过将以下内容添加到 CFLAGS 来编译未修改的 BSD 源代码: -DLIBBSD_OVERLAY -I/usr/include/bsd,并与-lbsd链接。

但是,如果您打算分发您的构建系统,您应该使用 pkg-configlibbsd-overlay 包,而不是硬编码这些值。

【讨论】:

  • 这就是我在 Ubuntu 上编译程序的方法c.c: gcc $(pkg-config --cflags libbsd-overlay) c.c -o c $(pkg-config --libs libbsd-overlay)
猜你喜欢
  • 2017-08-15
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2013-09-04
  • 2021-12-19
相关资源
最近更新 更多