Я использую VS Code с расширениями «C/C++», «CMake Tools» и «Qt Official» для создания простого консольного приложения Qt. main.cpp
просто печатает сообщение «Привет, мир». После сборки консоль (с именем «CMake/Launch») показывает, что она запускает мое приложение:
PS C:\Sumbur\QtExample\build\Debug> ."C:/Sumbur/QtExample/build/Debug/myApp.exe"
Который ничего не выводит и не показывает ошибок. Я обнаружил, что мое приложение просто не может найти библиотеки DLL Qt - после выполнения windeployqt
, который копирует все необходимые библиотеки, приложение работает правильно, и VS Code показывает выходные данные. Как указать VS Code сопровождать мое приложение библиотеками DLL, как это делает, например, Qt Creator, без копирования этих Dll в папку сборки?
@RemyLebeau. Я подключаюсь динамически. Это был вопрос: как указать VS Code загружать библиотеки Dll для имитации поведения Qt Qreator.
Вы не можете связать динамически. Вы можете связать только статически или отложить загрузку (если ваш компоновщик поддерживает это). В противном случае вы можете загружать динамически с помощью явных вызовов LoadLibrary()
(что происходит за кулисами отложенной загрузки). Итак, что вы на самом деле пытаетесь использовать?
AFAIK, если ваше приложение связано с библиотеками Qt и не может найти библиотеки DLL при запуске, вы получите сообщение об ошибке. Что заставляет вас говорить: «[вы] обнаружили, что [ваше] приложение просто не может найти библиотеки DLL Qt». В этой связи ваш вопрос нуждается в некоторой доработке грамматики и пунктуации. Вышеприведенное предложение — не единственное предложение, которое мне сложно прочитать (еще один пример: «Как рассказать [...] как [...]»), и в результате я даже не знаю, какой сценарий подойдет вам, и а что нет.
@RemyLebeau Интересно, что означает man ld
, когда упоминается динамическое связывание примерно в сотне мест? Я предполагаю, что это то же самое, что вы имеете в виду, когда говорите об отложенной загрузке, но откуда мне знать.
@Atmo «вы получите сообщение об ошибке». Вы можете получить его, а можете и не получить, в зависимости от вашей цепочки инструментов, оболочки и черт знает чего еще.
См. github.com/microsoft/vscode-cmake-tools/blob/main/docs/… вам нужно будет установить переменную среды path
для папки, содержащей библиотеки DLL.
@n.m.couldbeanAI man ...
все предназначено для документации, отличной от Windows, но некоторые вещи в вопросе ОП подразумевают, что вместо этого используется Windows.
@RemyLebeau странно, как мне запускать gcc и ld в Windows каждый божий день?
Во первых я имел в виду Windows, но и Linux лишним не будет. По поводу ссылок - я тоже не совсем понял. Нет ли динамического компоновщика, который должен находить символы в динамической библиотеке во время выполнения?
Спасибо Алану Бертлзу. Для запуска конфигурации необходимо добавить среду PATH
:
"configurations": [
{
"name": "My application",
"type": "cppvsdbg",
"request": "launch",
"program": "${command:cmake.getLaunchTargetDirectory}",
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{
// add the directory where our target was built to the PATHs
// it gets resolved by CMake Tools:
"name": "PATH",
"value": "${env:PATH}:${command:cmake.getLaunchTargetDirectory}"
}
],
"externalConsole": false
}
]
Я не понимаю, почему некоторые люди отвечают в комментариях, а не публикуют ответы, поэтому я сделал это сам, просто чтобы закрыть тему.
Обновление: вот мой CMakeLists.txt
:
cmake_minimum_required(VERSION 3.17)
project(MyFirstQt)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(Qt6_DIR "C:/Dev/Qt/6.8.0/msvc2022_64/lib/cmake/Qt6")
find_package(Qt6 REQUIRED COMPONENTS Core)
qt_standard_project_setup()
set(PROJECT_SOURCES
../src/main.cpp
)
qt_add_executable(myApp MANUAL_FINALIZATION ${PROJECT_SOURCES})
target_link_libraries(myApp PRIVATE
Qt6::Core
)
include(GNUInstallDirs)
install(TARGETS myApp
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
qt_finalize_executable(myApp)
Папка bin
Qt также находится в PATH
var, но я еще не заменил жестко закодированный путь к ней.
Однако я не понимаю, как это решает проблему, как запрашивает вопрос... «Как указать VS Code сопровождать мое приложение DLL, как это делает, например, Qt Creator, без копирования этих Dll в папку сборки?». предположительно это решение означает, что необходимые библиотеки DLL находятся в том же каталоге, что и ваш исполняемый файл в дереве сборки. Итак, либо ваш вопрос заключался в запросе ограничения, которое ваша конфигурация системы сборки уже сделала ненужным, либо ваше решение подразумевает, что вы изменили конфигурацию системы сборки, чтобы нарушить это требование?
Меня очень смущает то, что линия "program": "${command:cmake.getLaunchTargetDirectory}",
действительно вам подходит. каталог не является исполняемым целевым файлом.
@старболл. Я использую VS Code всего несколько дней, а CMake — всего 2 недели, поэтому я не очень понимаю, как работает это решение, но оно действительно работает. Как говорится в комментарии к фрагменту кода, эта строка позволяет CMake Tools находить библиотеки Qt. Если вам интересно, добавлю CMakeLists.txt
, кто знает, может поможет.
Если вы используете статическую ссылку на библиотеки DLL, они должны находиться в той же папке, что и EXE, или в папке на системном пути поиска. В противном случае вам придется загружать их вручную во время выполнения из любой папки, которую вы хотите. Именно так работают библиотеки DLL.