Нарушения ODR с использованием SFML в глобальном фрагменте модуляC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Нарушения ODR с использованием SFML в глобальном фрагменте модуля

Сообщение Anonymous »

Я пытаюсь создать проект с помощью модулей SFML и C ++ 20. Этот проект будет построен как с MSVC, так и с GCC 14.2. Теперь, насколько мне известно (пожалуйста, поправьте меня, если я ошибаюсь): < /p>

SFML не официально не поддерживает модули (даже если есть активный запрос на вытягивание, чтобы добавить его, за исключением для GCC) < /li>
Внутренне, в том числе через глобальный фрагмент модуля все, что мне нужно, от SFML и STD (вероятно, рассмотрение предварительных заголовков, если начнутся начнутся слишком долго).
Я настраиваю проект, и через некоторое время я застрял, пытаясь использовать SF :: font и SFML -класс, который использует STD: string , со строительностью для строительства, потому что сборы ofcc ye of obsc ofcc ye of std std std: string , со строительством rcc, потому что сборы. Например: < /p>

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

[build] C:/.../bin/ld.exe: CMakeFiles/.../src/Game.cpp.obj: in function `std::__cxx11::basic_string::_Alloc_hider::~_Alloc_hider()':
[build] C:/.../lib/gcc/x86_64-w64-mingw32/14.2.0/include/c++/bits/basic_string.h:186: multiple definition of `std::__cxx11::basic_string::_Alloc_hider::~_Alloc_hider()'; CMakeFiles/.../src/main.cpp.obj:C:/.../lib/gcc/x86_64-w64-mingw32/14.2.0/include/c++/bits/basic_string.h:186: first defined here
< /code>
Минимальный пример, который я смог сражаться: < /p>
main.cpp
import Game;

int main()
{
Game game;
game.run();
}
< /code>
game.ixx
module;

#include 

export module Game;

export class Game
{
public:
Game();
void run();

private:
sf::RenderWindow m_window;
sf::Font m_font;
};
< /code>
game.cpp
module;

#include 

module Game;

Game::Game() : m_window(sf::VideoMode({1920u, 1080u}), "My Game"), m_font("Sansation.tff")
{
}

void Game::run()
{
}
Я оставил в объекте sf :: renderwindow , поскольку это не вызывает никакой проблемы.
my cmakelists.txt просто:

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

set(CMAKE_CXX_STANDARD 20)

project(MyGame LANGUAGES CXX)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

set(FETCHCONTENT_FULLY_DISCONNECTED ON)
include(FetchContent)
FetchContent_Declare(SFML
GIT_REPOSITORY https://github.com/SFML/SFML.git
GIT_TAG 3.0.1
GIT_SHALLOW ON
EXCLUDE_FROM_ALL
SYSTEM)
FetchContent_MakeAvailable(SFML)

file(GLOB_RECURSE MODULE_INTERFACE_FILES CONFIGURE_DEPENDS "src/*.ixx")
file(GLOB_RECURSE MODULE_IMPLEMENTATION_FILES CONFIGURE_DEPENDS "src/*.cpp")

add_executable(${PROJECT_NAME})

target_sources(${PROJECT_NAME}
PUBLIC src/main.cpp)
target_sources(${PROJECT_NAME}
PUBLIC
FILE_SET cxx_modules TYPE CXX_MODULES
FILES ${MODULE_INTERFACE_FILES} PRIVATE ${MODULE_IMPLEMENTATION_FILES}
)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
target_link_libraries(${PROJECT_NAME} PRIVATE SFML::Graphics)
< /code>
Я понятия не имею, как решить это. При значениях лица это кажется ошибкой в ​​том, как определяется std :: string 
и другие стандартные классы, что кажется мне невозможным. Поэтому я думаю, что это связано с тем, как включают охранники, работают в контексте модуля, но хотя я не уверен, можно ли включать один и тот же файл как в основной интерфейсной блок, так и в блок реализации, без него проект даже не будет компилироваться.

Подробнее здесь: https://stackoverflow.com/questions/796 ... e-fragment
Ответить

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

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

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

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

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