同样的库,但在fedora和ubuntu中有不同的名字?

时间:2014-08-11 19:24:31

标签: c json automake

我正在构建一个使用json编码和解码的应用程序。我原来在fedora下开发了应用程序并使用了json-c库。在Debian类型的发行版中,这个库名为libjson。

我很肯定它是同一个库,因为我的代码在没有任何修改的情况下工作,一旦我改变库的风格。我真的不想为此维护两个不同的代码库。有没有办法在autoconf中使用某种条件来帮助解决这个问题?特别是在Makefile.am中链接正确的库方面?另外,如何设置.h文件以在右侧发行版中使用正确的名称?我可以使用某种全球可访问的DEFINE吗?

例如

#ifdef debian
#include libjson
#endif
#ifdef fedora
#include json-c
#endif

任何线索都会有所帮助。

克里斯

2 个答案:

答案 0 :(得分:1)

通常使用配置脚本解决此类发行版包装的特性。我在这里放了一个cmake脚本来解决这个问题。如果您使用的是自动工具 - 我想您可以从我的脚本中编写相同的文件。

# - Try to find the JSON C library
#
# Once done this will define
#
#  JSON_FOUND    - system has the JSON C library
#  JSON_INCLUDES - JSON C include directory
#  JSON_LIBRARY  - JSON C library

FIND_PATH(
  JSON_INCLUDES
  NAMES json.h
  PATH_SUFFIXES json-c json
  PATHS /usr/include /usr/local/include
  )

MESSAGE(STATUS "Include ${JSON_INCLUDES}")

FIND_LIBRARY(JSON_LIBRARY
  NAMES json-c json
  PATHS /usr/lib /usr/local/lib
  )

IF(JSON_LIBRARY AND JSON_INCLUDES)
  SET(JSON_LIBRARIES ${JSON_LIBRARY})
  SET(JSON_FOUND "YES")
ELSE()
  SET(JSON_FOUND "NO")
ENDIF()

IF(JSON_FOUND)
  MESSAGE(STATUS "JSON C: ${JSON_LIBRARIES}")
ELSE()
  MESSAGE(FATAL_ERROR "Could not find JSON C library")
ENDIF()

MARK_AS_ADVANCED(JSON_LIBRARIES JSON_INCLUDES JSON_FOUND)

# End of file

autotools相同(修改你的configure.ac):

PKG_CHECK_MODULES([JSON_C], [json],,[
  PKG_CHECK_MODULES([JSON_C], [json-c])
]

答案 1 :(得分:0)

我要感谢indiv和Tanuki的帮助。我能够在他们的帮助下找到解决方案。

我最终选择了configure.ac

中的以下内容
AC_SEARCH_LIBS([json_tokener_parse_ex], [json-c libjson], [], [
    echo "JSON-C (fedora) and/or LibJson (debian) library ) is missing."
    exit -1])
AC_CHECK_LIB([json-c], [json_tokener_parse_ex], [LIBJSONC=true], [], [])
AM_CONDITIONAL([LINK_LIBJSONC], [test x$LIBJSONC = xtrue])
AC_CHECK_LIB([libjson], [json_tokener_parse_ex], [LIBJSON=true], [], [])
AM_CONDITIONAL([LINK_LIBJSON], [test x$LIBJSON = xtrue])

让我在Makefile.am中使用以下内容

if LINK_LIBJSON
  USE_LIBJSON=-llibjson
endif
if LINK_LIBJSONC
  USE_LIBJSON=-ljson-c
endif
AM_LDFLAGS= $(USE_LIBJSON) ...