Последние несколько дней я искал повсюду и, похоже, не могу решить эту проблему, или, может быть, я просто не понял некоторых ответов.
У меня есть приложение (точнее, игра), созданное с помощью SFML, которое мне удалось скомпилировать для Linux с версией 2.4.2. Я хочу перейти на 2.5.1 и иметь возможность компилировать в Windows, поэтому я изменил файл CMakeLists.txt на это:
cmake_minimum_required(VERSION 3.0)
# There is no real need for C++17 or 14, but I like to use up-to-date versions
if (CMAKE_MAJOR_VERSION VERSION_GREATER 3.8.0)
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 14)
endif (CMAKE_MAJOR_VERSION VERSION_GREATER 3.8.0)
if (WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Binaries/)
endif (WIN32)
# Includes
include_directories(include)
# Source files
set(SOURCE_FILES
source/main.cpp
source/Game.cpp
)
# Assets
set(ASSETS
assets/Fonts/xolonium.ttf
)
# Debug Mode
project(HexDebug VERSION 1.0 LANGUAGES CXX)
set(CMAKE_BUILD_TYPE DEBUG) # This is ignored by MSVC
#SFML Package
find_package(SFML 2.5 CONFIG COMPONENTS system window graphics network audio REQUIRED)
if (SFML_FOUND)
set(SFML_STATIC_LIBRARIES TRUE)
if (WIN32)
set(SFML_USE_STATIC_STD_LIBS TRUE)
endif (WIN32)
endif (SFML_FOUND)
if (UNIX)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Binaries/Debug/)
endif (UNIX)
foreach(asset ${ASSETS})
configure_file(${asset} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${asset} COPYONLY)
endforeach(asset)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_compile_options(${PROJECT_NAME} PRIVATE -g -Wall -O0 -D_DEBUG)
if (SFML_FOUND)
target_link_libraries(${PROJECT_NAME} sfml-system sfml-window sfml-graphics sfml-network sfml-audio)
endif (SFML_FOUND)
#Release Mode
project(Hex VERSION 1.0 LANGUAGES CXX)
set(CMAKE_BUILD_TYPE RELEASE) # This is ignored by MSVC
if (UNIX)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Binaries/Release/)
endif (UNIX)
foreach(asset ${ASSETS})
configure_file(${asset} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${asset} COPYONLY)
endforeach(asset)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_compile_options(${PROJECT_NAME} PRIVATE "-O3")
if (SFML_FOUND)
target_link_libraries(${PROJECT_NAME} sfml-system sfml-window sfml-graphics sfml-network sfml-audio)
endif (SFML_FOUND)
Cmake работает и генерирует решение VS, которое я могу построить с помощью msbuild (обратите внимание, что я не хочу запускать Visual Studio, а использую только msbuild). Но как только я пытаюсь запустить его, он запрашивает библиотеки DLL, а я этого не хочу.
Я думал, что это будет решено путем статической компоновки (я мало знаю о статической или динамической компоновке), но она все еще требует их.
В этой ссылке они говорят, что нам больше не нужно включать $ {SFML_INCLUDE_DIR} и $ {SFML_LIBRARIES}: https://en.sfml-dev.org/forums/index.php?topic=24070.0
Как мне этого избежать? Я хочу быть полностью независимым от DLL или, по крайней мере, иметь возможность включать каталог bin, установленный из скомпилированных и установленных двоичных файлов SFML (которые я скомпилировал, а не предварительно скомпилирован).
Спасибо.
Как создать статическую версию?
Исходные тексты SFLM должны поставляться с README, в котором объясняется, как построить SFML статически.
Я проверил, но это не так. Я не знаю, что мне делать.
Непонятно, в чем заключается ваша проблема, о которой вы нас спрашиваете. Вы хотите статическое связывание, но оно не работает? - Необходимо указать вызов
set(SFML_STATIC_LIBRARIES ON)
доfind_package()
. Обратите внимание, что для статического связывания с SFML вам потребуется статическая сборка самого SFLM.