libconfig:在使用CMake编译时出现错误

4

我正在项目中使用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);

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

3
  1. 不要忽略警告。
  2. 同样,您可以使用FILE(GLOB config_source_files $ {CMAKE_CURRENT_SOURCE_DIR} / * .c)locale.h是否包含在libconfig.c中?
- Iharob Al Asimi
1个回答

1
似乎是libconfig.c没有看到:
#include <xlocale.h>

这个头文件在OS X构建中是必需的,但在Linux中不是(详见下文解释)。

你可能缺少某些配置选项或构建开关,这会导致在OS X构建中通常包含此头文件。我建议您查看libconfig.c以及其他libconfig头文件,看看是否有一个#ifdef来控制<xlocale.h>的包含(尝试使用“xlocale.h”进行搜索)。还要检查任何伴随的READMEmakefile或其他文档。


在Linux上,newlocalelocale_t所需的头文件为:

#include <locale.h>

但是,OS X 要求:

#include <xlocale.h>

当有疑问时,请查看手册页面

NEWLOCALE(3) BSD Library Functions Manual NEWLOCALE(3)

NAME newlocale -- Create a new locale

SYNOPSIS #include <xlocale.h>

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

好的,libconfig.c是该库的源文件。在他们的代码中添加包含似乎不太对。我认为问题很可能出在其他地方。 - davak
@davak:这取决于这个库是否在Mac OS X上进行过测试,但你说得对,也许OP缺少一些配置选项或构建参数,可以包含适用于OS X的正确头文件 - 我会更新答案来涵盖这一点。 - Paul R
嗯,我已经使用libconfig好几年了,虽然没有在OS X下使用过。但是作者声称他们支持OS X,我没有理由不相信他们。我刚刚查看了源代码,为了包含xlocale.h,必须定义HAVE_XLOCALE_H。 - davak
感谢查看源代码以确认 - 我猜原帖作者需要检查文档和/或附带的makefile以查看他缺少什么。 - Paul R
1
非常感谢您提供的答案。我最终想出了一个解决方法,使我能够使用libconfig附带的autotools脚本,在两个系统上编译而不会出现警告。现在,在Linux上编译时的警告也消失了;所以我想我确实缺少了一些编译器标志。 - M4urice

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