В модульных тестах отсутствуют библиотеки DLLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В модульных тестах отсутствуют библиотеки DLL

Сообщение Anonymous »

Итак, на Ubuntu всё работает, на Windows, к сожалению, нет. У меня есть проект с одной библиотекой и одним приложением.
Мой корневой файл CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.20)
project(WingWorkshop
VERSION 1.0.0
LANGUAGES CXX)

# Only do these if this is the main project, and not if it is included through add_subdirectory
if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
# Optionally set things like CMAKE_CXX_STANDARD, CMAKE_POSITION_INDEPENDENT_CODE here
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
IF (WIN32)
# set stuff for windows
set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}")
ELSE ()
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-deprecated-copy -Wno-maybe-uninitialized -Wno-unused -pedantic -O3 -fprofile-arcs -ftest-coverage -Wno-error=float-conversion -fPIC ${CMAKE_CXX_FLAGS}")
ENDIF ()
# Let's ensure -std=c++xx instead of -std=g++xx
set(CMAKE_CXX_EXTENSIONS OFF)

# Let's nicely support folders in IDEs
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# Find ccache in the system
find_program(CCACHE_PROGRAM ccache)

# If ccache is found, use it as the compiler launcher
if(CCACHE_PROGRAM)
message(STATUS "ccache found: ${CCACHE_PROGRAM}")
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})  # For C++ compiler
else()
message(STATUS "ccache not found, proceeding without it.")
endif()

# Testing only available if this is the main app
# Note this needs to be done in the main CMakeLists
# since it calls enable_testing, which must be in the
# main CMakeLists.
include(CTest)
endif ()

add_compile_definitions(_USE_MATH_DEFINES)

# Include CPM for dependency management
include(cmake/CPM.cmake)

# Use CPM to fetch spdlog
CPMAddPackage(
NAME spdlog
GITHUB_REPOSITORY gabime/spdlog
VERSION 1.14.1
OPTIONS "SPDLOG_BUILD_SHARED OFF"  # Ensure static library
)
# Use CPM to fetch cxxopts
CPMAddPackage(
NAME cxxopts
GITHUB_REPOSITORY jarro2783/cxxopts
VERSION 3.0.0
)
# Use CPM to fetch openxlsx
CPMAddPackage(
NAME OpenXLSX
GITHUB_REPOSITORY troldal/OpenXLSX
GIT_TAG ededa1e8398305d0983648d3e9f120ff7e228d2b
OPTIONS "OPENXLSX_BUILD_DOCS=OFF" "OPENXLSX_BUILD_TESTS=OFF"
)
# Use CPM to fetch json
CPMAddPackage(
NAME nlohmann_json
GITHUB_REPOSITORY nlohmann/json
GIT_TAG v3.11.2 # You can change this to the latest version if needed
)

# Add Eigen using CPM
CPMAddPackage(
NAME Eigen
GITLAB_REPOSITORY libeigen/eigen
GIT_TAG 3.4
OPTIONS
"EIGEN_BUILD_DOC OFF"           # Do not build documentation
"EIGEN_BUILD_PKGCONFIG OFF"     # Optional, disables pkg-config
"BUILD_TESTING OFF"             # Disable building and running tests
)

# CSV parser.
# Add csv-parser using CPM
CPMAddPackage(
NAME csv-parser
GITHUB_REPOSITORY vincentlaucsb/csv-parser
GIT_TAG 2.3.0  # Replace with the appropriate version you want
OPTIONS "CMAKE_POSITION_INDEPENDENT_CODE ON"
)
# Add PMP library using CPM
# Set EIGEN3_INCLUDE_DIR if it is not already defined
if (NOT DEFINED EIGEN3_INCLUDE_DIR)
set(EIGEN3_INCLUDE_DIR "${Eigen_SOURCE_DIR}/")
endif()
find_package(Eigen 3.4.0 REQUIRED)
# Check if PMP is already included with CPM
CPMAddPackage(
NAME pmp
GITHUB_REPOSITORY pmp-library/pmp-library
GIT_TAG 3.0.0  # Specify the version you need, or leave it out for the latest
OPTIONS
"PMP_BUILD_TESTS OFF"      # Prevents building tests
"PMP_BUILD_EXAMPLES OFF"   # Prevents building examples
"PMP_BUILD_DOCS OFF"        # Prevents building documentation
"PMP_BUILD_VIS OFF"
)

# Pass version number to the code
add_definitions(-DWINGWORKSHOP_VERSION="${PROJECT_VERSION}")

# Subdirectories
add_subdirectory(apps)
add_subdirectory(src)
add_subdirectory(tests)
мой src/CMakeLists.txt:

Код: Выделить всё

file(GLOB_RECURSE SOURCES "*.cpp")

# Create the library from the collected source files
add_library(wing_workshop_lib STATIC ${SOURCES})

add_library(wing_workshop::lib ALIAS wing_workshop_lib)

target_include_directories(wing_workshop_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include)
target_compile_features(wing_workshop_lib PUBLIC cxx_std_20)

target_link_libraries(wing_workshop_lib PUBLIC spdlog::spdlog cxxopts OpenXLSX::OpenXLSX nlohmann_json Eigen3::Eigen csv pmp)

set_target_properties(wing_workshop_lib PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}"
)

# IDEs should put the headers in a nice place
source_group(
TREE "${PROJECT_SOURCE_DIR}/include"
PREFIX "Header Files"
FILES ${HEADER_LIST})
и мое приложение/CMakeLists.txt:

Код: Выделить всё

add_executable(WingWorkshop app.cpp)
target_link_libraries(WingWorkshop PRIVATE wing_workshop_lib spdlog::spdlog nlohmann_json)

set_target_properties(WingWorkshop PROPERTIES CXX_STANDARD 20)

target_compile_options(WingWorkshop PUBLIC "$")

set_target_properties(WingWorkshop PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
Проблема
Создание исполняемого файла для моего приложения работает так, как ожидалось. Никаких проблем. Однако запуск моих модульных тестов больше не работает.
Это мой файл test/CMakeLists.txt:

Код: Выделить всё

# Testing library
CPMAddPackage(
NAME Catch2
GITHUB_REPOSITORY catchorg/Catch2
VERSION 3.4.0
)

add_executable(unit_tests
io/test_obj.cpp
)

target_link_libraries(unit_tests PRIVATE wing_workshop_lib Catch2::Catch2WithMain cxxopts OpenXLSX::OpenXLSX Eigen3::Eigen csv pmp)
set_target_properties(unit_tests PROPERTIES CXX_STANDARD 20)
target_compile_options(unit_tests PUBLIC "$")

# If you register a test, then ctest and make test will run it.
# You can also run examples and check the output, as well.
add_test(NAME test_obj COMMAND unit_tests [obj])

# Labels.
set_tests_properties(test_obj PROPERTIES LABELS WW)
Исполняемый файл собран, и я могу найти его в каталоге build/tests, но когда я пытаюсь запустить его, я получаю сообщение об ошибке что отсутствует куча файлов dll, например. spdlog.dll, pmp.dll и т. д.
Я не знаю, как это происходит. Исполняемый файл unit_tests должен использовать ту же wing_workshop_lib, что и мое приложение. Но мое приложение работает, а модульные тесты — нет.
Кто-нибудь это поймет? Как я могу это исправить?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ssing-dlls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»