Как добавить библиотеку Ziplib в Clion на Ubuntu - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь добавить ZipLip в свой проект, используя Clion на Ubuntu, но у меня есть такой вывод:

====================[ 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.

1 Ответ

0 голосов
/ 25 февраля 2020

Вызов link_libraries() в этом случае принимает неправильные аргументы. Команда link_libraries() принимает аргументы существующих целей CMake или имена библиотек. Это также избыточно с вашим вызовом target_link_libraries(), так как этот уже связывает ZipLib с TryZip.

Попробуйте удалить вызов на link_libraries(), так как эта функция CMake устарела и его использование крайне не рекомендуется. Вызов include_directories() аналогично устарел в пользу команды target-Speci c, поэтому рассмотрите возможность использования 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)
...