Я никогда не приходил к этой ошибке частичной части, когда использует Regulairair /Стандартный CPP, поэтому я подозреваю, что это специфично для работы с модулями. Вот небольшой пример: < /p>
main.cpp
Код: Выделить всё
import platform;
#include
int main(int argc, char** argv)
{
x();
}
< /code>
pplatform.ixx
module;
#include
#include
export module platform;
export struct x
{
x()
{
connect(0, 0, 0);
}
};
< /code>
cmakelists.txt
get_filename_component(FOLDER_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
get_filename_component(PARENT_DIR ${CMAKE_CURRENT_LIST_DIR} PATH)
get_filename_component(CATEGORY_NAME ${PARENT_DIR} NAME)
add_executable (${FOLDER_NAME} "main.cpp" )
target_link_libraries(${FOLDER_NAME} PUBLIC "ws2_32.lib")
target_sources(${FOLDER_NAME} PRIVATE FILE_SET "${FOLDER_NAME}_sources" TYPE CXX_MODULES BASE_DIRS "${CMAKE_CURRENT_LIST_DIR}" FILES
"platform.ixx"
)
set_property(TARGET ${FOLDER_NAME} PROPERTY CXX_STANDARD 20)
< /code>
Я понимаю, что основная причина заключается в том, как перевода взаимодействуют с модулями. Заголовок Windows автоматически включает в себя первую версию Winsock, поэтому использование WinSock2 вызывает различные определения символов. Обычно это на самом деле не имеет большого значения, потому что блоки перевода независимы друг от друга, и любые неиспользованные символы разряжаются. Блок, который по какой -то причине также включает Windows.h Я хотел бы понять, есть ли способ избежать этого, я могу Предотвратить переопределение, тщательно управляя тем, как и где используется Windows.h, но если какая -либо третья библиотека включает Windows.h может создать ту же проблему.
Подробнее здесь: https://stackoverflow.com/questions/794 ... 20-modules
Мобильная версия