Как сообщить VS Code, где использовать библиотеки Qt при запуске моего приложения

Я использую 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 в папку сборки?

Если вы используете статическую ссылку на библиотеки DLL, они должны находиться в той же папке, что и EXE, или в папке на системном пути поиска. В противном случае вам придется загружать их вручную во время выполнения из любой папки, которую вы хотите. Именно так работают библиотеки DLL.

Remy Lebeau 15.07.2024 03:40

@RemyLebeau. Я подключаюсь динамически. Это был вопрос: как указать VS Code загружать библиотеки Dll для имитации поведения Qt Qreator.

qloq 15.07.2024 03:44

Вы не можете связать динамически. Вы можете связать только статически или отложить загрузку (если ваш компоновщик поддерживает это). В противном случае вы можете загружать динамически с помощью явных вызовов LoadLibrary() (что происходит за кулисами отложенной загрузки). Итак, что вы на самом деле пытаетесь использовать?

Remy Lebeau 15.07.2024 03:51

AFAIK, если ваше приложение связано с библиотеками Qt и не может найти библиотеки DLL при запуске, вы получите сообщение об ошибке. Что заставляет вас говорить: «[вы] обнаружили, что [ваше] приложение просто не может найти библиотеки DLL Qt». В этой связи ваш вопрос нуждается в некоторой доработке грамматики и пунктуации. Вышеприведенное предложение — не единственное предложение, которое мне сложно прочитать (еще один пример: «Как рассказать [...] как [...]»), и в результате я даже не знаю, какой сценарий подойдет вам, и а что нет.

Atmo 15.07.2024 06:10

@RemyLebeau Интересно, что означает man ld, когда упоминается динамическое связывание примерно в сотне мест? Я предполагаю, что это то же самое, что вы имеете в виду, когда говорите об отложенной загрузке, но откуда мне знать.

n. m. could be an AI 15.07.2024 06:45

@Atmo «вы получите сообщение об ошибке». Вы можете получить его, а можете и не получить, в зависимости от вашей цепочки инструментов, оболочки и черт знает чего еще.

n. m. could be an AI 15.07.2024 06:47

См. github.com/microsoft/vscode-cmake-tools/blob/main/docs/… вам нужно будет установить переменную среды path для папки, содержащей библиотеки DLL.

Alan Birtles 15.07.2024 08:32

@n.m.couldbeanAI man ... все предназначено для документации, отличной от Windows, но некоторые вещи в вопросе ОП подразумевают, что вместо этого используется Windows.

Remy Lebeau 15.07.2024 11:01

@RemyLebeau странно, как мне запускать gcc и ld в Windows каждый божий день?

n. m. could be an AI 15.07.2024 12:19

Во первых я имел в виду Windows, но и Linux лишним не будет. По поводу ссылок - я тоже не совсем понял. Нет ли динамического компоновщика, который должен находить символы в динамической библиотеке во время выполнения?

qloq 15.07.2024 21:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо Алану Бертлзу. Для запуска конфигурации необходимо добавить среду 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 находятся в том же каталоге, что и ваш исполняемый файл в дереве сборки. Итак, либо ваш вопрос заключался в запросе ограничения, которое ваша конфигурация системы сборки уже сделала ненужным, либо ваше решение подразумевает, что вы изменили конфигурацию системы сборки, чтобы нарушить это требование?

starball 18.07.2024 02:19

Меня очень смущает то, что линия "program": "${command:cmake.getLaunchTargetDirectory}", действительно вам подходит. каталог не является исполняемым целевым файлом.

starball 18.07.2024 02:22

@старболл. Я использую VS Code всего несколько дней, а CMake — всего 2 недели, поэтому я не очень понимаю, как работает это решение, но оно действительно работает. Как говорится в комментарии к фрагменту кода, эта строка позволяет CMake Tools находить библиотеки Qt. Если вам интересно, добавлю CMakeLists.txt, кто знает, может поможет.

qloq 18.07.2024 09:18

Другие вопросы по теме