我正在构建一个使用json编码和解码的应用程序。我原来在fedora下开发了应用程序并使用了json-c库。在Debian类型的发行版中,这个库名为libjson。
我很肯定它是同一个库,因为我的代码在没有任何修改的情况下工作,一旦我改变库的风格。我真的不想为此维护两个不同的代码库。有没有办法在autoconf中使用某种条件来帮助解决这个问题?特别是在Makefile.am中链接正确的库方面?另外,如何设置.h文件以在右侧发行版中使用正确的名称?我可以使用某种全球可访问的DEFINE吗?
例如
#ifdef debian
#include libjson
#endif
#ifdef fedora
#include json-c
#endif
任何线索都会有所帮助。
克里斯
答案 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) ...