C ++ Linux, как использовать libtar - PullRequest
0 голосов
/ 06 июня 2011

Я скачал и установил libtar.Я правильно добавил заголовочный файл (#include <libtar.h>).Я использую KDevelop, который автоматически распознает функции tar_append_tree и tar_open , когда я начинаю их набирать.Я использую cmake с KDevelop (в качестве опции при создании нового проекта), и пока все, что требовалось для связывания (pthreads, общая память и математика), все, что мне нужно было сделать, это добавить соответствующий флаг в CMAKE_EXE_LINKER_FLAGS.Я знаю, что libtar нужна -ltar для работы, но я все еще получаю: неопределенная ссылка на tar_open, неопределенная ссылка на tar_append_tree .Может кто-нибудь, пожалуйста, помогите?Я не знаю ни о какой другой библиотеке tar, и мне действительно нужно организовать тысячи файлов xml в архиве tarball перед сжатием.

edit: теперь я нашел libarchive, который, как предполагается, намного лучше, чем libtar.Однако я что-то здесь упускаю.Как явно указать KDevelop / Cmake, как связываться с этими библиотеками?Для libarchive нет флага ссылки (по крайней мере, тот, который я не смог найти в Google), и снова, когда я пытаюсь скомпилировать, я получаю неопределенные ссылки на импортированные функции.

Спасибо!

1 Ответ

2 голосов
/ 14 октября 2012

Я уверен, что есть более одного решения, но здесь мое.Я создал два файла

  • FindLIBTAR.cmake в папке моего проекта в cmake/Modules/
  • libtar.pc в /usr/lib/pkgconfig

FindLIBTAR.cmake

# - Try to find LIBTAR 
# Find LIBTAR headers, libraries and the answer to all questions.
#
#  LIBTAR_FOUND               True if libuuid got found
#  LIBTAR_INCLUDE_DIRS        Location of libuuid headers 
#  LIBTAR_LIBRARIES           List of libraries to use libuuid 
#

INCLUDE( FindPkgConfig )

IF ( LIBTAR_FIND_REQUIRED )
    SET( _pkgconfig_REQUIRED "REQUIRED" )
ELSE ( LIBTAR_FIND_REQUIRED )
    SET( _pkgconfig_REQUIRED "" )   
ENDIF ( LIBTAR_FIND_REQUIRED )

IF ( LIBTAR_MIN_VERSION )
    PKG_SEARCH_MODULE( LIBTAR ${_pkgconfig_REQUIRED} libtar>=${LIBTAR_MIN_VERSION} )
ELSE ( LIBTAR_MIN_VERSION )
    PKG_SEARCH_MODULE( LIBTAR ${_pkgconfig_REQUIRED} libtar )
ENDIF ( LIBTAR_MIN_VERSION )

IF( NOT LIBTAR_FOUND AND NOT PKG_CONFIG_FOUND )
    FIND_PATH( LIBTAR_INCLUDE_DIRS libtar.h )
    FIND_LIBRARY( LIBTAR_LIBRARIES libtar)

    # Report results
    IF ( LIBTAR_LIBRARIES AND LIBTAR_INCLUDE_DIRS ) 
        SET( LIBTAR_FOUND 1 )
        IF ( NOT LIBTAR_FIND_QUIETLY )
            MESSAGE( STATUS "Found libtar: ${LIBTAR_LIBRARIES}" )
        ENDIF ( NOT LIBTAR_FIND_QUIETLY )
    ELSE ( LIBTAR_LIBRARIES AND LIBTAR_INCLUDE_DIRS )   
        IF ( LIBTAR_FIND_REQUIRED )
            MESSAGE( SEND_ERROR "Could NOT find libtar" )
        ELSE ( LIBTAR_FIND_REQUIRED )
            IF ( NOT LIBTAR_FIND_QUIETLY )
                MESSAGE( STATUS "Could NOT find libtar" )   
            ENDIF ( NOT LIBTAR_FIND_QUIETLY )
        ENDIF ( LIBTAR_FIND_REQUIRED )
    ENDIF ( LIBTAR_LIBRARIES AND LIBTAR_INCLUDE_DIRS )
ENDIF( NOT LIBTAR_FOUND AND NOT PKG_CONFIG_FOUND )

MARK_AS_ADVANCED( LIBTAR_LIBRARIES LIBTAR_INCLUDE_DIRS )

libtar.pc

###########################################################################
# libtar installation details
###########################################################################

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libtar
URL: http://www.feep.net/libtar/
Description: Library for Tar files
Version: 1.2.11-8
Libs: -L${libdir} -ltar -Wl,-Bsymbolic-functions -Wl,-z,relro 
Libs.private: 
Cflags: -I${includedir}

FindLIBTAR.cmake использует pkgconfig для поиска библиотеки libtar, а libtar.pc используется pkgconfig чтобы найти библиотеку.Вы можете поместить файл cmake в то же место, где CMake размещает все файлы поиска (/usr/share/cmake/Modules/), если вы не хотите помещать его в каталог вашего проекта.Если вы сохраните его в папке вашего проекта, вам нужно будет добавить это к CMAKE_MODULE_PATH через:

SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/")
...