C++ Linux 如何使用 libtar

标签 c++ linux linker tar

我已经下载并安装了 libtar。 我已正确添加头文件 ( #include <libtar.h> )。 我使用 KDevelop,它会在我开始输入时自动识别函数 tar_append_treetar_open。 我将 cmake 与 KDevelop 一起使用(作为创建新项目时的一个选项),到目前为止,所有需要链接的东西(pthreads、共享内存和数学)我所要做的就是在 CMAKE_EXE_LINKER_FLAGS 中添加适当的标志。我知道 libtar 需要 -ltar 才能工作,但我仍然得到:undefined reference to tar_open ,undefined reference to tar_append_tree。 有人可以帮忙吗?我不知道任何其他 tar 库,我确实需要在压缩之前在一个 tarball 中组织数千个 xml 文件。

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

谢谢!

最佳答案

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

  • FindLIBTAR.cmake 在我的项目文件夹中 cmake/Modules/
  • libtar.pc/usr/lib/pkgconfig

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

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

关于C++ Linux 如何使用 libtar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6247727/

相关文章:

c++ - CString 'Trim' : is not a member, 为什么?

c++ - append 两个字符时出现段错误 - C++

在析构函数中的 main 之后无法读取 exit_code

linux - 使用 Linux 加载程序时 ldconfig 错误 :"is not a symbolic link"

c - "Undefined Symbol _memset"

c++ - 如何编写可以在 msdos 上运行的 C++ 控制台 exe?

c++ - For 循环退出条件(size_t 与 int)

c++ - 如何使用 GTK 将图像添加到按钮

linux - 为什么 TCP/IP 速度取决于发送数据的大小?

haskell - 如何在其他机器上运行 ghc 编译的二进制文件?