Я пытался создать общие библиотеки C++ для Python, используя cmake и pybind11, но получаю ошибки, которые не знаю, как исправить

Начнем с CMake. Каждый раз, когда я пытаюсь создать общие библиотеки через командную строку или приложение cmake, я получаю одну и ту же ошибку:

The C compiler identification is unknown
The CXX compiler identification is unknown
Detecting C compiler ABI info
Detecting C compiler ABI info - failed
Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe
Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - broken
CMake Error at C:/Program Files/CMake/share/cmake-3.30/Modules/CMakeTestCCompiler.cmake:67 (message):
  The C compiler

    "C:/msys64/mingw64/bin/gcc.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: 'C:/Users/Exspiravit/Desktop/Sudoku/build/CMakeFiles/CMakeScratch/TryCompile-d79xak'
    
    Run Build Command(s): "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/amd64/MSBuild.exe" cmTC_d902b.vcxproj /p:Configuration=Debug /p:Platform=x64 /p:VisualStudioVersion=17.0 /v:n
    MSBuild version 17.10.4+10fbfbf2e for .NET Framework

    Build started 16/8/2024 11:01:50 ΞΌΞΌ.

    

    Project "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj" on node 1 (default targets).

    PrepareForBuild:

      Creating directory "cmTC_d902b.dir\Debug\".

    C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(513,5): warning MSB8003: The WindowsSDKDir property is not defined. Some build tools may not be found. [C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj]

      Structured output is enabled. The formatting of compiler diagnostics will reflect the error hierarchy. See https://aka.ms/cpp/structured-output for more details.

      Creating directory "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\Debug\".

      Creating directory "cmTC_d902b.dir\Debug\cmTC_d902b.tlog\".

    InitializeBuildStatus:

      Creating "cmTC_d902b.dir\Debug\cmTC_d902b.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.

      Touching "cmTC_d902b.dir\Debug\cmTC_d902b.tlog\unsuccessfulbuild".

    ClCompile:

      C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.40.33807\bin\HostX64\x64\CL.exe /c /W1 /WX- /diagnostics:column /D _MBCS /D "CMAKE_INTDIR=\"Debug\"" /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_d902b.dir\Debug\\" /Fd"cmTC_d902b.dir\Debug\vc143.pdb" /external:W1 /Gd /TC /errorReport:queue "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\testCCompiler.c"

      Microsoft (R) C/C++ Optimizing Compiler Version 19.40.33812 for x64

      Copyright (C) Microsoft Corporation.  All rights reserved.

      cl /c /W1 /WX- /diagnostics:column /D _MBCS /D "CMAKE_INTDIR=\"Debug\"" /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"cmTC_d902b.dir\Debug\\" /Fd"cmTC_d902b.dir\Debug\vc143.pdb" /external:W1 /Gd /TC /errorReport:queue "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\testCCompiler.c"

      testCCompiler.c

    Link:

      C:\msys64\mingw64\bin\ld.exe /ERRORREPORT:QUEUE /OUT:"C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\Debug\cmTC_d902b.exe" /INCREMENTAL /ILK:"cmTC_d902b.dir\Debug\cmTC_d902b.ilk" /NOLOGO /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"C:/Users/Exspiravit/Desktop/Sudoku/build/CMakeFiles/CMakeScratch/TryCompile-d79xak/Debug/cmTC_d902b.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/Users/Exspiravit/Desktop/Sudoku/build/CMakeFiles/CMakeScratch/TryCompile-d79xak/Debug/cmTC_d902b.lib" /MACHINE:X64 cmTC_d902b.dir\Debug\testCCompiler.obj

      C:\msys64\mingw64\bin\ld.exe: cannot find /ERRORREPORT:QUEUE: No such file or directory

      C:\msys64\mingw64\bin\ld.exe: cannot find Β β– /: No such file or directory

    C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(1151,5): error MSB6006: "C:\msys64\mingw64\bin\ld.exe" exited with code 1. [C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj]

    Done Building Project "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj" (default targets) -- FAILED.

    

    Build FAILED.

    

    "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj" (default target) (1) ->

    (PrepareForBuild target) -> 

      C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(513,5): warning MSB8003: The WindowsSDKDir property is not defined. Some build tools may not be found. [C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj]

    

    

    "C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj" (default target) (1) ->

    (Link target) -> 

      C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(1151,5): error MSB6006: "C:\msys64\mingw64\bin\ld.exe" exited with code 1. [C:\Users\Exspiravit\Desktop\Sudoku\build\CMakeFiles\CMakeScratch\TryCompile-d79xak\cmTC_d902b.vcxproj]

    

        1 Warning(s)

        1 Error(s)

    

    Time Elapsed 00:00:00.98

    
    

  

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:10 (project)

Configuring incomplete, errors occurred!

Также вот CMakeLists.txt, который я использую сейчас:

cmake_minimum_required(VERSION 3.30)

set(CMAKE_C_COMPILER "C:/msys64/mingw64/bin/gcc.exe")
set(CMAKE_CXX_COMPILER "C:/msys64/mingw64/bin/g++.exe")
set(CMAKE_LINKER "C:/msys64/mingw64/bin/ld.exe")



project(SudokuProject)


set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)


include_directories(${CMAKE_SOURCE_DIR}/include)


file(GLOB GEN_SOURCES "src/gen.cpp")
file(GLOB CHECK_SOURCES "src/check.cpp")
file(GLOB LOGGER_SOURCES "src/logger.cpp")
file(GLOB WRAPPER_SOURCES "src/wrapper.cpp")


add_library(gen SHARED ${GEN_SOURCES})
add_library(check SHARED ${CHECK_SOURCES})
add_library(logger SHARED ${LOGGER_SOURCES})


add_library(wrapper MODULE ${WRAPPER_SOURCES})


target_include_directories(wrapper PRIVATE ${CMAKE_SOURCE_DIR}/include)
find_package(Python3 REQUIRED COMPONENTS Development)
target_include_directories(wrapper PRIVATE ${Python3_INCLUDE_DIRS})
target_link_libraries(wrapper PRIVATE ${Python3_LIBRARIES})


target_include_directories(gen PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_include_directories(check PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_include_directories(logger PRIVATE ${CMAKE_SOURCE_DIR}/include)


target_link_libraries(gen PRIVATE logger)
target_link_libraries(check PRIVATE logger)


set_target_properties(gen PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_target_properties(check PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_target_properties(logger PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set_target_properties(wrapper PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Теперь давайте поговорим о pybind11. По какой-то причине я получаю сообщение об ошибке #include <pybind11/pybind11.h>, в котором говорится, что невозможно открыть исходный файл Python.h.

Что касается CMake, я изначально установил его с веб-сайта, и после того, как я создал CMakeLists.txt, я попытался создать библиотеки с помощью Windows CMD, а затем получил ошибку, но я подумал, что это как-то связано с CMakeLists.txt, потому что это Я впервые использовал cmake и не знаю, как он работает, я думал, что сделал что-то не так с текстовым файлом. Затем я попытался найти способ исправить CMakeLists.txt, но потом подумал, что он не покажет мне эту ошибку и, в частности, начальную часть ошибки, в которой идентификация компилятора неизвестна, но точная строка, в которой возникает проблема, поэтому я пытался это найти. После этого я решил удалить его и установить с помощью msys64 (поскольку именно так я устанавливал компиляторы C/C++), и, конечно же, проблема заключалась в том, что я проверил %PATH% и не нашел там проблемы, я попробовал приложение cmake на этот раз я нажимаю «Создать» и та же проблема, я удалил его, потому что после некоторого поиска я прочитал, что кто-то сказал, что установка его с mingw, а не с исходного веб-сайта, создает подобные проблемы, и я попробовал еще раз как с приложением, так и с командной строкой, то же самое Затем я попытался указать компиляторы с помощью приложения, та же проблема.


Теперь о pybind11, кроме #include <pybind11/pybind11.h> я тоже использую #include <pybind11/stl.h> и у них обоих была одна и та же ошибка. В первый раз я установил его с помощью pip install, но после небольшого количества проб и ошибок я решил установить его с помощью mingw64, и ошибка для второго заголовка была исправлена, но после этого я не нашел способа решить проблему.


Теперь я только что уперся в стену и не могу продолжить проект, вероятно, из-за моего невежества, потому что я впервые использую их оба и хочу выяснить, в чем проблема, а также IDE, которую я использую, - VSC, не знаю, связано ли это как-то с ошибками, но на данный момент это может быть что угодно.

Следуйте руководству по сборке Использование CMake в MSYS2

3CxEZiVlQ 16.08.2024 22:54

Какой генератор вы используете (cmake -G ???)

Dmytro Ovdiienko 16.08.2024 23:02

@3CxEZiVlQ, спасибо, но есть ли какая-то реальная разница, если я установлю его с помощью msys2 или с веб-сайта?

Αθανάσιος Κολτσίδης 16.08.2024 23:15

@DmytroOvdiienko Я не использую какой-либо конкретный генератор, кроме сборки mkdir, сборки cd make ... но попробую cmake -G, не знал, что он существует, пока вы его не набрали

Αθανάσιος Κολτσίδης 16.08.2024 23:15

@ΑθανάσιοςΚολτσίδης Думаю, в твоем случае так и должно быть -G Unix Makefiles

Dmytro Ovdiienko 16.08.2024 23:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В журналах написано, что CMake не смог обнаружить работающий компилятор. Если вы хотите использовать компилятор Microsoft Visual Studio, запустите окно терминала Visual Studio с предварительно настроенными переменными среды: Инструменты -> Командная строка -> Командная строка разработчика.

Кроме того, убедитесь, что у вас установлен Windows SDK с помощью установщика Visual Studio — в журналах указано The WindowsSDKDir property is not defined. Some build tools may not be found. Это может быть связано с тем, что переменные среды не установлены (см. пункт выше).

На самом деле это мне очень помогло, указало правильный путь, чтобы найти проблему и исправить ее для cmake, но теперь я застрял с pybind11 и не могу понять проблему.

Αθανάσιος Κολτσίδης 18.08.2024 18:58

Другие вопросы по теме