LINUX.ORG.RU

Как подключить к проекту в CLion статически Qt5 через CMake?

 , ,


0

2

Скачал исходники, скомпилировал с флагом -static в /usr/local/Qt5_static/ . Создал пустой проект, где буду использовать Qt, изменил CMakeLists.txt до состояния:

cmake_minimum_required(VERSION 3.6)
project(Splines)

set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -pedantic -static -stdlib=libc++ -lc++abi -v")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
set(SOURCE_FILES main.cpp)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(Qt5_DIR "/usr/local/Qt5_static/")
find_package(Qt5Widgets)

add_executable(Splines ${SOURCE_FILES})

target_link_libraries(Splines Qt5::Widgets)

Выдаёт ошибку линковки:

/usr/bin/ld: attempted static link of dynamic object `/usr/lib/libQt5Widgets.so.5.7.0'
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/Splines.dir/build.make:124: /home/darthvlado/MEGA/MEGAsync/workspace/ClionProjects/Splines/Splines] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/Splines.dir/all] Ошибка 2
make: *** [Makefile:84: all] Ошибка 2

Очевидно, вместо указанного мной пути пытается добавить shared-библиотеку и фейлится. Пробовал некоторые другие варианты, в таком случае ошибку выдаёт сам cmake ещё до сборки.

Как правильно прилинковать статически Qt5 через cmake?

find_package(Qt5Widgets)

Возможно проблемы здесь, он берёт CMake-модули из динамической сборки Qt. Или из дистра, где думают, что Qt может быть только динамическим.

EXL ★★★★★
()
Ответ на: комментарий от RazrFalcon

Почему не QtC и qmake? ССЗБ

Потому что хочу использовать CLion, уж больно нравятся мне IDEшки от JetBrains.

Возможно проблемы здесь, он берёт CMake-модули из динамической сборки Qt. Или из дистра, где думают, что Qt может быть только динамическим.

Проблемы разумеется здесь. И вообще то я написал в начале сообщения, что скачал вручную сурцы Qt и скомпилировал в отдельную папку с флагом -static.

darthvlado
() автор топика
Ответ на: комментарий от darthvlado

Раз нравятся - умейте ими пользоваться.

что скачал вручную сурцы Qt и скомпилировал в отдельную папку с флагом -static.

И что это меняет?

RazrFalcon ★★★★★
()
Ответ на: комментарий от darthvlado

Ну так возьми и посмотри, какие модули там у тебя цепляются и как в них либы линкуются.

Юзай make V=1, к примеру, чтобы было ясно как там оно готовится.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Да никаких модулей не цепляются, пустой проект. Первый раз с Qt имею дело. Можно конечно забить на статическую линковку, но раз уж захотел - надо как-то этого добиться.

В манах написано только как статически прилинковать к qmake - с этим я дела тем более не имел.

дистр если что арч

darthvlado
() автор топика
Ответ на: комментарий от darthvlado

Да никаких модулей не цепляются, пустой проект.

find_package(Qt5Widgets)

Знаешь, если не можешь с этим справиться, попробуй так:

cmake_minimum_required(VERSION 3.6)
project(Splines)

set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -pedantic -static -stdlib=libc++ -lc++abi -v")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
set(SOURCE_FILES main.cpp)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(Qt5_DIR "/usr/local/Qt5_static/")

add_executable(Splines ${SOURCE_FILES})

target_link_libraries(Splines /usr/local/Qt5_static/lib/Qt5Widgets.a /usr/local/Qt5_static/lib/Qt5Gui.a /usr/local/Qt5_static/lib/Qt5Core.a)
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

target_link_libraries(Splines /usr/local/Qt5_static/lib/Qt5Widgets.a /usr/local/Qt5_static/lib/Qt5Gui.a /usr/local/Qt5_static/lib/Qt5Core.a)

Не помогло...

make[2]: *** Нет правила для сборки цели «/usr/local/Qt5_static/lib/Qt5Widgets.a», требуемой для «/home/darthvlado/MEGA/MEGAsync/workspace/ClionProjects/Splines/Splines».  Останов.
make[2]: *** Ожидание завершения заданий…
darthvlado
() автор топика

Кстати, зачем тебе статическая линковка?

stevejobs ★★★★☆
()

Во-первых, если собираешь только чтобы использовать на локальной машине, то статическая линковка тебе не нужна, CMake по-умолчанию будет собирать исполняемый файл с RPATH и CLion корректно запустится с нужными библиотеками.

Во-вторых, к сожалению, поддержка статической версии Qt в её же CMake-скриптах до недавнего времени оставляла желать лучшего, скорее всего она до сих пор так и не доделана.

Dendy ★★★★★
()

А что скормить вручную QT_INCLUDE_DIR и QT_LIBRARY_DIR cmake'у не помогает?

И да

>target_link_libraries(Splines /usr/local/Qt5_static/lib/Qt5Widgets.a /usr/local/Qt5_static/lib/Qt5Gui.a /usr/local/Qt5_static/lib/Qt5Core.a)

Не помогло...

разумеется. Там нужно свои пути указывать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.