PDA

View Full Version : deploy vcpkg dependencies in QtCreator-Cmake



tuli
23rd August 2021, 11:20
Hi,

I am porting my qmake project to cmake. So far it all goes well, but I have the following problem when hitting "build" from within qtcreator as opposed to manually running Cmake.

My project links to several packages provided by the vcpkg manager, which integrates well with cmake.
When i manually configure and compile my project with "cmake --build .", then cmake copies the .dll files from the vcpkg-libraries correctly to the build dir.
But this does not happen when I hit "build" in QtCreator. The CMakeLists.txt is the exact same.

Here is my CMakeFile. It's basically the default one generated by QtCreator for a widget app.
The second line provides the vcpkg integration, and I then link to the library "capstone_dll" installed in vcpkg.



cmake_minimum_required(VERSION 3.5)

set(CMAKE_TOOLCHAIN_FILE "C:/Users/memem/vcpkg/scripts/buildsystems/vcpkg.cmake")

project(widgetcmake VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_compile_definitions(QT_NO_KEYWORDS)


# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.

#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(capstone)


include_directories(C:/Users/memem/vcpkg/installed/x64-windows/include)
link_directories(C:/Users/memem/vcpkg/installed/x64-windows/lib)

set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(widgetcmake
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
else()
if(ANDROID)
add_library(widgetcmake SHARED
${PROJECT_SOURCES}
)
else()
add_executable(widgetcmake
${PROJECT_SOURCES}
)
endif()
endif()

target_link_libraries(widgetcmake PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(widgetcmake PRIVATE capstone_dll)


set_target_properties(widgetcmake PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)

if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(widgetcmake)
endif()

d_stranz
23rd August 2021, 15:43
I don't see anything in your cmake script that would cause the DLL to be copied. This seems to be something that the command line tool must do on its own, recognizing that one of the target link libraries is the .lib counterpart to a DLL. Try running the command line with the -trace or -trace-expand option turned on, so you can see what cmake is doing.

I haven't used cmake with Qt Creator, but I would guess there is a similar way to provide the -trace runtime argument to the way Qt Creator invokes cmake so you can look for differences.

Usually I have an explicit "install" command (https://cmake.org/cmake/help/latest/command/install.html) in my CMakelist.txt file that copies runtime dependencies to the output directory.

tuli
23rd August 2021, 17:44
There's no further commandlinetool involved. I just do "cmake .." + "cmake --build ."
In the example: https://vcpkg.readthedocs.io/en/latest/examples/installing-and-using-packages/
it says:

> Note: The correct sqlite3.dll is automatically copied to the output folder when building for x86-windows. You will need to distribute this along with your application.

I will diff the -trace and report back.