【问题标题】:libconfig: error when compiling using CMakelibconfig:使用 CMake 编译时出错
【发布时间】:2015-12-14 00:26:15
【问题描述】:

我在一个项目中使用 libconfig,并认为使用我的嵌套 CMakeLists.txt 脚本将其与其余代码一起编译很方便。以下是 libconfig 源文件所在目录的内容:

[config] -> ls
CMakeLists.txt  libconfig.c       libconfig.h++  scanctx.h  strbuf.c
grammar.c       libconfigcpp.c++  libconfig.hh   scanner.c  strbuf.h
grammar.h       libconfigcpp.cc   parsectx.h     scanner.h  wincompat.h
grammar.y       libconfig.h       scanctx.c      scanner.l

这里是 CMakeLists.txt 的内容:

set(config_source_files
    grammar.c
    libconfig.c
    libconfigcpp.c++
    scanctx.c
    scanner.c
    strbuf.c
)
add_library(config ${config_source_files})

当我在我的 Linux (Fedora 20) 机器上编译时收到一些警告。在我的 OSX (Yosemite) 机器上编译时出现错误:

/Users/m4urice/myproject/src/utilities/config/libconfig.c:90:3: error: 
    use of undeclared identifier 'locale_t'
locale_t loc = newlocale(LC_NUMERIC_MASK, "C", NULL);

有人知道这可能是什么原因吗?

【问题讨论】:

  • 1.不要忽视警告。 2. 另外,您可以使用FILE(GLOB config_source_files ${CMAKE_CURRENT_SOURCE_DIR}/*.c)locale.h 是否包含在 libconfig.c 中?

标签: c macos cmake libconfig


【解决方案1】:

libconfig.c 似乎没有看到:

#include <xlocale.h>

这是 OS X 构建所必需的,但不是 Linux 所必需的(请参阅下面的更完整说明)。

您可能缺少某些配置选项或构建开关,通常会导致此标头包含在 OS X 构建中。我建议您看一下libconfig.c,也许还有其他libconfig 头文件,看看是否有一个#ifdef 控制&lt;xlocale.h&gt; 的包含(尝试grepping“xlocale.h”)。还要检查任何随附的 READMEmakefile 或其他文档。


在 Linux 上,newlocalelocale_t 所需的标头是:
#include <locale.h>

但 OS X 需要:

#include <xlocale.h>

如有疑问,请参阅man page

NEWLOCALE(3) BSD 库函数手册 NEWLOCALE(3)

名字 newlocale -- 创建一个新的语言环境

概要 #include &lt;xlocale.h&gt;

locale_t
newlocale(int mask, const char * locale, locale_t base);

【讨论】:

  • 嗯,libconfig.c 是库的源文件。在他们的代码中添加包含听起来不正确。我认为问题可能出在其他地方。
  • @davak:这取决于这个库是否曾经在 Mac OS X 上测试过,但你是对的,也许 OP 缺少一些配置选项或构建参数,其中包含正确的 OS 标头X - 我会更新答案以涵盖这一点。
  • 好吧,我已经使用 libconfig 多年了,但从来没有在 OS X 下使用过。但作者声称他们支持 OS X,我认为没有理由不相信他们。我只是看了一下源代码,为了包含 xlocale.h,必须定义 HAVE_XLOCALE_H。
  • 感谢您查看源代码以确认 - 我猜 OP 需要检查文档和/或随附的 makefile 以查看他缺少的内容。
  • 非常感谢这些回答者。我终于想出了一个解决方法,它允许我使用 libconfig 附带的 autotools 脚本,并在两个系统上编译时不会发出警告。现在在 Linux 上编译时的警告也消失了;所以我想我确实错过了一些编译器标志。
猜你喜欢
  • 2019-09-24
  • 2014-11-02
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2016-06-10
  • 2015-10-23
  • 2012-10-21
  • 2015-10-03
相关资源
最近更新 更多