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


有谁知道这可能是由于什么?

最佳答案

看来libconfig.c没有看到:

#include <xlocale.h>


OS X构建需要此功能,而Linux则不需要(请参阅下面的完整说明)。

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


在Linux上,newlocalelocale_t所需的标头为:

#include <locale.h>


但是OS X要求:

#include <xlocale.h>


如有疑问,请参见man page


NEWLOCALE(3)BSD库功能手册NEWLOCALE(3)

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

概要
#include <xlocale.h>

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

07-24 18:37