【问题标题】:How to add Ziplib library in Clion on Ubuntu如何在 Ubuntu 上的 Clion 中添加 Ziplib 库
【发布时间】:2020-06-08 12:51:36
【问题描述】:

我正在尝试在 ubuntu 上使用 Clion 将 ZipLip 添加到我的项目中,但我有以下输出:

====================[ Build | TryZip | Debug ]==================================

/home/david/Snap/clion-2019.2.4/bin/cmake/linux/bin/cmake --build 
   /home/david/CLionProjects/TryZip/cmake-build-debug --target TryZip -- -j 2
[ 13%] Built target bzip2
[ 31%] Built target zlib
[ 83%] Built target lzma
[ 95%] Built target ZipLib
Scanning dependencies of target TryZip
[ 97%] Linking CXX executable ../bin/TryZip
/usr/bin/ld: cannot find -lExternalLibrary/ZipLib
collect2: error: ld returned 1 exit status
CMakeFiles/TryZip.dir/build.make:102: recipe for target '../bin/TryZip' failed
make[3]: *** [../bin/TryZip] Error 1
CMakeFiles/Makefile2:109: recipe for target 'CMakeFiles/TryZip.dir/all' failed
make[2]: *** [CMakeFiles/TryZip.dir/all] Error 2
CMakeFiles/Makefile2:116: recipe for target 'CMakeFiles/TryZip.dir/rule' failed
make[1]: *** [CMakeFiles/TryZip.dir/rule] Error 2
Makefile:131: recipe for target 'TryZip' failed
make: *** [TryZip] Error 2

这是我的 Cmakefile.txt

cmake_minimum_required(VERSION 3.15)
project(TryZip)

if(BOOST_FILESYSTEM)
    include_directories(${BOOST_INCLUDE_DIR})
    link_directories(${BOOST_LIB_DIR})
    add_definitions(-DUSE_BOOST_FILESYSTEM)
else()
    if(MSVC)
        add_definitions(-DFILESYSTEM_EXPERIMENTAL)
    endif()
endif()
if(BOOST_FILESYSTEM)
    if(UNIX)
        find_package(Boost COMPONENTS system filesystem REQUIRED)

        target_link_libraries(${Boost_FILESYSTEM_LIBRARY}
                ${Boost_SYSTEM_LIBRARY})
    endif()
endif()

add_subdirectory(ExternalLibrary/ZipLib)
link_libraries(ExternalLibrary/ZipLib)
include_directories(ExternalLibrary/ZipLib)


set(CMAKE_CXX_STANDARD 17)
add_executable(TryZip main.cpp ExternalLibrary/ZipLib/ZipFile.cpp)

target_link_libraries(TryZip ZipLib)

有人可以帮我解决这个问题吗? 我的 ZipLib 文件夹与我的 cmakefile.txt 文件位于同一文件夹中。

【问题讨论】:

    标签: cmake linker-errors


    【解决方案1】:

    在这种情况下,对link_libraries() 的调用似乎接受了错误的参数。 link_libraries() 命令采用现有 CMake 目标或库名称的参数。您的target_link_libraries() 调用也是多余的,因为这已经ZipLib 链接到TryZip

    尝试删除对 link_libraries() 的调用,因为此 CMake 函数已被弃用,并且强烈建议不要使用它。 include_directories() 调用同样被弃用,支持特定于目标的命令,因此请考虑改用 target_include_directories()

    假设您添加的子目录ExternalLibrary/ZipLib 包含一个额外的CMakeLists.txt 文件用于配置ZipLib 目标,您应该不需要再次添加ZipFile.cpp 文件。如果此文件已经在子目录中编译到目标ZipLib,则无需再次编译到TryZip

    add_subdirectory(ExternalLibrary/ZipLib)
    
    set(CMAKE_CXX_STANDARD 17)
    add_executable(TryZip main.cpp)
    
    target_include_directories(TryZip PRIVATE ExternalLibrary/ZipLib)
    target_link_libraries(TryZip PRIVATE ZipLib)
    

    编辑:根据您的反馈,ZipLib 似乎也依赖于pthread,但不知何故它没有正确链接。您可以尝试将以下内容添加到您的 ExternalLibrary/ZipLib/CMakeLists.txt 文件中(如果它尚不存在),以利用 CMake 的 FindThreads 模块:

    find_package(Threads REQUIRED)
    
    ... 
    target_link_libraries(ZipLib PUBLIC Threads::Threads)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 2021-08-01
      • 1970-01-01
      • 2020-09-21
      • 2017-08-26
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多