C ++ Linux如何使用libtar

时间:2011-06-06 04:21:00

标签: c++ linux linker tar

我已经下载并安装了libtar。 我已正确添加头文件(#include <libtar.h>)。 我使用KDevelop,当我开始输入时,它会自动识别 tar_append_tree tar_open 这两个函数。 我将cmake与KDevelop一起使用(作为创建新项目时的一个选项),到目前为止,所有我需要做的就是在CMAKE_EXE_LINKER_FLAGS中添加相应的标志。我知道libtar需要 -ltar 才能工作,但我仍然得到:对tar_open的未定义引用,对tar_append_tree的未定义引用。 有人可以帮忙吗?我不知道任何其他tar库,我真的需要在压缩之前在tarball中组织数千个xml文件。

编辑:我现在发现libarchive应该比libtar好得多。但是我在这里遗漏了一些东西。如何明确告诉KDevelop / Cmake如何链接这些库? libarchive没有链接标志(至少不是我在谷歌上找到的),而且当我尝试编译时,我得到了对导入函数的未定义引用。

谢谢!

1 个答案:

答案 0 :(得分:2)

我确信不止一个解决方案,但这是我的。我创建了两个文件

  • 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库, pkgconfig 使用libtar.pc查找库。如果您不想将cmake文件放在项目目录中,可以将cmake文件放在CMake放置所有查找文件(/usr/share/cmake/Modules/)的相同位置。如果您将其保留在项目的文件夹中,则需要通过以下方式将其添加到CMAKE_MODULE_PATH

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