Усиление связи в проекте CLion - PullRequest
1 голос
/ 25 сентября 2019

Я хочу связать мой c ++ проект на CLion с Boost.Чтобы упростить портирование, я бы предпочел, чтобы все библиотеки были непосредственно в файлах проекта, поэтому я поместил папку boost непосредственно в файлы своего проекта, а затем приступил к редактированию CMakeList.txt, чтобы связать библиотеку.Я хочу связать мой c ++ проект на CLion с Boost.Чтобы упростить портирование, я бы предпочел, чтобы все библиотеки были непосредственно в файлах проекта, поэтому я поместил папку boost непосредственно в файлы своего проекта, а затем приступил к редактированию CMakeList.txt, чтобы связать библиотеку.

set(BOOST_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT ${PROJECT_SOURCE_DIR}/boost_1_71_0/)
set(BOOST_INCLUDEDIR ${PROJECT_SOURCE_DIR}/boost_1_71_0/boost)
find_package(Boost COMPONENTS system filesystem)
/.../
target_link_libraries(untitled ${Boost_LIBRARIES})

Но CMake постоянно говорит мне, что "" Не удалось найти Boost (отсутствует: файловая система системы) (найдена версия "1.71.0") ".Я попытался добавить 1.71.0 в find_package, но это не изменит того факта, что CMake сообщает мне, что не может найти Boost.Дело в том, что если моя строка find_package становится такой:

find_package(Boost COMPONENTS)

CMake говорит "Found Boost: C: / Users / kimer / CLionProjects / без названия / boost_1_71_0 (найдена подходящая версия" 1.71.0 ", требуется минимум"1.71.0") ".Я не уверен, что об этом думать.

Я не обязательно хочу скомпилировать библиотеку, поскольку большинство компонентов являются только заголовками и не требуют компиляции.Кроме того, я попытался скомпилировать Boost, но он требует msvc, но я использую компилятор mingw w64 g ++ и также не нашел каких-либо решений по этому поводу (я попытался запустить boost.build bootstrap.bat с параметром mingw, но он возвращаетошибка cpp и не компилируется).

Что я делаю не так, чтобы связать библиотеку?

Редактировать: У меня точно такая же проблема с библиотеками только заголовков, как chrono

Редактировать 2: Хорошо, мне кажется, что мне нужно скомпилировать Boost с моим компилятором Mingw x86_64-win32, но всякий раз, когда я пытаюсь его скомпилировать, я получаю эту ошибку:

.\bootstrap.bat gcc
Bootstrapping the build engine
sysinfo.cpp: In function 'unsigned int {anonymous}::std_thread_hardware_concurrency()':
sysinfo.cpp:93:21: error: 'std::thread' has not been declared
         return std::thread::hardware_concurrency();
                     ^~~~~~
Fichier introuvable

Failed to bootstrap the build engine
Please consult bootstrap.log for further diagnostics.

Редактировать 3: Я нашелпочему он не скомпилировался: я использовал версию Mingw для w32, а не POSIX.Все это прекрасно скомпилировано с версией POSIX;Теперь у меня есть скомпилированная библиотека Boost в папке «Boost».Я изменил свой файл CMakeLists.txt:

set(Boost_DEBUG ON)
set(BOOST_INCLUDEDIR ${PROJECT_SOURCE_DIR}/boost/include/boost-1_71/)
set(BOOST_LIBRARYDIR ${PROJECT_SOURCE_DIR}/boost/lib)
set(BOOST_NO_SYSTEM_PATHS ON)
find_package(Boost COMPONENTS system)

. Библиотека Boost выполняет поиск в нужных каталогах, как сообщает мне отладчик.Он также ищет файлы с такими именами:

-- [ D:/Dev/CMake/share/cmake-3.15/Modules/FindBoost.cmake:2040 ] Searching for SYSTEM_LIBRARY_RELEASE: boost_system-mgw81-mt-1_71;boost_system-mgw81-mt;boost_system-mgw81-mt;boost_system-mt-1_71;boost_system-mt;boost_system-mt;boost_system-mt;boost_system
-- [ D:/Dev/CMake/share/cmake-3.15/Modules/FindBoost.cmake:2095 ] Searching for SYSTEM_LIBRARY_DEBUG: boost_system-mgw81-mt-d-1_71;boost_system-mgw81-mt-d;boost_system-mgw81-mt-d;boost_system-mt-d-1_71;boost_system-mt-d;boost_system-mt-d;boost_system-mt;boost_system

, в то время как моя скомпилированная библиотека Boost создала следующие файлы A:

libboost_system-mgw81-mt-d-x64-1_71.a
libboost_system-mgw81-mt-x64-1_71.a

Возможно, это проблема, но как я могу ее решить?

1 Ответ

0 голосов
/ 26 сентября 2019

Я нашел всю историю, и я записываю решение на тот случай, если кому-то немного потерянному, как я, это нужно.

Так что, если вы хотите связать boost с проектом на окнах, используя cmake с mingwв качестве компилятора сначала необходимо загрузить и установить mingw с потоками posix и архитектурой cours x86_64.Затем вы загружаете источники повышения и можете выполнить этот урок , чтобы построить Boost.Сборка Boost обязательна для большинства библиотек Boost.Кстати, чтобы добавить что-то в Windows PATH, вам нужно перейти в Панель управления> Система и безопасность> Система> Дополнительные параметры> Переменные среды и там вы редактируете переменную PATH (вы можете добавить папку mingw / bin в PATH).,Последний шаг займет довольно много времени.

После того, как вы соберете свои библиотеки, вам нужно связать их с файлом CMakeLists.txt.Это код, который вы хотите добавить в файл:

set(Boost_ARCHITECTURE -x64)
set(BOOST_ROOT <path/to/boost>)
set(BOOST_INCLUDEDIR <path/to/boost/includes>)
set(BOOST_LIBRARYDIR <path/to/boost/lib>)
set(BOOST_NO_SYSTEM_PATHS ON)
find_package(Boost COMPONENTS  <the components you want to load>)
include_directories(${Boost_INCLUDE_DIRS})

add_executable(your_project main.cpp)

target_link_libraries(untitled ${Boost_LIBRARIES})

Так что там есть что-то, чего вы не найдете в FindBoost doc, это переменная Boost_ARCHITECTURE, которая по какой-то причине не указана.Дело в том, что файлы lib, созданные в ускоренной сборке, будут называться так: libboost_atomic-mgw81-mt-x64-1_71.a, но по умолчанию FindBoost будет искать имена, такие как boost_atomic-mgw81-mt-1_71, которые он никогда не найдет, поскольку все имена имеют архитектуру в нем.,Таким образом, чтобы FindBoost мог искать .a файлы с -x64 (или -x32) в их имени, вам нужно добавить строку set(Boost_ARCHITECTURE -x64), в противном случае cmake сообщит вам, что не нашел Boost.

...