не могу найти библиотеку в / usr / local / lib - PullRequest
0 голосов
/ 06 октября 2018

когда я использую CMakeLists.txt с:

find_library(cryptoppV libcryptopp.a)

target_link_libraries(${PROJenter code hereECT_NAME} ${cryptoppV})

, тогда я могу найти библиотеку в / usr / local / lib и сделать программу на C ++ правильной иполучил правильный результат.

но когда я заменяю его на:

-- find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} cryptopp)

, тогда я получаю сообщение об ошибке:

ld: library not found for -lcryptopp

почему cmake не связывает / usr / local / lib с помощьюдефолт?я сделал что-то не так?

- добавлено aijinsong 7 октября 2018 г. 6:37

Я в замешательстве.когда CMakeLists.txt был:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
find_package(Boost 1.58 REQUIRED thread)
target_link_libraries(${PROJECT_NAME}  Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

, компилятор может найти cryptopp / sha.h.но когда CMakeLists.txt был:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
## find_package(Boost 1.58 REQUIRED thread)
## target_link_libraries(${PROJECT_NAME}  Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

сообщение об ошибке было:

fatal error: 'cryptopp/sha.h' file not found
#include <cryptopp/sha.h>

, когда CMakeLists.txt было:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
find_package(Boost 1.58 REQUIRED thread)
## target_link_libraries(${PROJECT_NAME}  Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

сообщение об ошибкебыло еще:

fatal error: 'cryptopp/sha.h' file not found
#include <cryptopp/sha.h>

почему я использую cryptopp, который cmake попросил меня связать с библиотекой Boost :: thread?я в растерянности.

- добавлено aijinsong 7 октября 2018 11:56 AM

И если я использую g++ main.cpp -o main -lcryptopp, я могу получитьправильный результат.Это показывает, что библиотека cryptopp установлена ​​правильно, и g ++ может найти библиотеку.почему, когда я делаю это с помощью make, она не может найти библиотеку?

- добавить для запуска KamilCuk

- добавьте aijinsong 7 октября 2018 года 15:27

когда я сделаю это, сделав VERBOSE = 1, я получил следующее сообщение:

cd /Users/aijinsong/Documents/projects/com.aijs.cxx/bolochain/src && /usr/local/Cellar/cmake/3.12.3/bin/cmake -E cmake_link_script CMakeFiles/bolochain.dir/link.txt --verbose=1

и текст в link.txt: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/bolochain.dir/main.cpp.o -o bolochain /usr/local/lib/libboost_thread-mt.dylib -lcryptopp /usr/local/lib/libboost_chrono-mt.dylib /usr/local/lib/libboost_system-mt.dylib /usr/local/lib/libboost_date_time-mt.dylib /usr/local/lib/libboost_atomic-mt.dylib

эта команда вызывает ссылку сбоя, но когда я редактирую ее, как показано ниже, команда команды c ++ link очень хорошо обрабатывает: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/bolochain.dir/main.cpp.o -o bolochain /usr/local/lib/libboost_thread-mt.dylib -lcryptopp /usr/local/lib/libboost_chrono-mt.dylib /usr/local/lib/libboost_system-mt.dylib /usr/local/lib/libboost_date_time-mt.dylib /usr/local/lib/libboost_atomic-mt.dylib

просто удалите: -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk

Я все еще работаю над этой проблемой.

- добавьте для KamilCuk end

1 Ответ

0 голосов
/ 08 октября 2018

Кулак, спасибо @Kamil Cuk.Аргумент -VERBOSE = 1 был настолько полезен, что я могу получить более подробные сообщения, которые показывают мне, что происходит, когда я использую make.

Дело в том, что когда я использую cmake в системе OSX.Он сгенерирует txt с именем 'link.txt', который включает в себя команды, и его часть выглядит следующим образом: -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk

, когда я удаляю эту часть, команды будут выполняться правильно.но когда я добавляю эту строку, команды выполняются неправильно.поэтому дело в том, что эта строка может ограничивать путь поиска в c ++.Спасибо @tsyvarev.Вы правы, -isysroot ограничил поиск компоновщиков c ++ /usr/local/lib.

Во-вторых, я не узнал, как удалить строку -isysroot ..., сгенерированную OSX cmake.Итак, мне нужно найти другое решение.

Когда я искал больше информации о find_package / include_directories / target_link_libraries, я обнаружил, что find_package нужен файл FindXXX.cmake, чтобы помочь ему найти файл заголовка и библиотекицель.Поэтому я гуглил файл FindCyptoPP.cmake.и в этом файле он находит буксировочные переменные, один из которых содержит значение пути к каталогу заголовка cryptopp, а другой - значение пути к библиотеке cryptopp.Затем я использую include_directories / target_link_libraries следующим образом, проблема войны решена.

find_package(CryptoPP)
include_directories(${CRYPTOPP_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${CRYPTOPP_LIBRARIES})

, а затем, когда я использую make -VERBOSE = 1, мне кажется, что при использовании CMakeLists.txt вывод немного отличается:

target_link_libraries(${PROJECT_NAME} cryptopp)

Когда я использую три строки, вывод содержит строку /usr/local/lib/libcryptopp.dylib.Когда я использую одну строку, вывод содержит строку -lcryptopp.

Итак, с командной строкой -isysroot командная строка -lcryptopp будет искать библиотеку в каталоге, определенном -isysroot, ив каталоге нет библиотеки с именем cryptopp, но под /usr/local/lib.Но с командной строкой /usr/local/lib/libcryptopp.dylib она дает абсолютный путь к библиотеке, поэтому ссылки просто выполняют задачу связывания и не нуждаются в поиске.Спасибо @Kamil Cuk еще раз.

Три, я знал, что include_directories / target_link_libraries - это два отдельных шага, один из которых используется для заголовочного файла включения, а другой - для библиотек ссылок.

Тем не менее, некоторые из них былипроблемы не подошвы: - как удалить -isysroot?создать файл FindXXX.cmake?- Как сделать /usr/local/lib каталогом поиска по умолчанию, и это был практический способ сделать это?

Я продолжу работать над ними и вернусь через несколько дней или недель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...