我已经下载并安装了 libtar。
我已正确添加头文件 ( #include <libtar.h>
)。
我使用 KDevelop,它会在我开始输入时自动识别函数 tar_append_tree 和 tar_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/