Проект Visual Studio CMake не может найти стандартные компоненты C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проект Visual Studio CMake не может найти стандартные компоненты C++

Сообщение Anonymous »

Вот файл CMakeLists.txt, который не работает. Я перенес проект с использования интерфейса WinAPI напрямую на использование SDL2. Вот результат CMakeLists.txt. За исключением того, что для целей данного обсуждения я использую в качестве исходного кода значительно упрощенную тестовую программу, которая напрямую и только зависит от SDL2.
cmake_minimum_required(VERSION 3.28)
project(my-project)
set (CMAKE_CXX_STANDARD 11)

set (TEST TestCase.cpp)

#set (CMAKE_PREFIX_PATH C:\\msys64\\ucrt64)
#find_package(SDL2 REQUIRED)
#unset(CMAKE_PREFIX_PATH)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
include_directories(. Library Tools Toolkit APClass Library/jpeg ${SDL2_INCLUDE_DIRS})
# include_directories(SYSTEM C:\\msys64\\mingw64\\include)

include(Library/CMakeLists.txt)
include(Tools/CMakeLists.txt)
include(APClass/CMakeLists.txt)

add_executable(TestProgram ${TEST} ${DRAWBOX} ${TOOLS} ${APCLASS})

target_compile_features(TestProgram PUBLIC cxx_std_11)
target_compile_options(TestProgram PRIVATE )

target_link_libraries(TestProgram ${SDL2_LIBRARIES} libSDL2_gfx.a
SDL2_image SDL2_ttf
)

Он не скомпилируется. При сборке TestCase.cpp возникает ошибка:
Error C1083 Cannot open include file: 'unistd.h': No such file or directory

Проблема стала очевидной, когда я экспериментировал с CMAKE_PREFIX_PATH, но это может не иметь никакого значения. Никакая очистка кэша не помогает. Аналогично сообщается и о множестве других стандартных заголовков, таких как «strings.h».
Я попробовал добавить строку 13:
include_directories(SYSTEM C:\\sys64\\mingw64\\include)

но, как оказалось, это приводит к появлению заголовков для другого компилятора и просто создает ужасный беспорядок.
Вот CMakeLists. txt, который работает, предшественник того, который не работает. Программа компилируется и запускается.
cmake_minimum_required(VERSION 3.28)
project(my-project)
set (CMAKE_CXX_STANDARD 11)

set (TEST Test/CheckerCheckerBoardBoard.cpp)

include_directories(. Library Tools Toolkit APClass Library/jpeg)

include(Library/CMakeLists.txt)
include(Tools/CMakeLists.txt)
include(APClass/CMakeLists.txt)

message( STATUS DRAWBOX=${DRAWBOX})

add_library(Drawbox STATIC ${DRAWBOX} ${TOOLS} ${APCLASS})
add_executable(TestProgram WIN32 ${TEST} ${DRAWBOX} ${TOOLS} ${APCLASS})

target_compile_features(Drawbox PUBLIC cxx_std_11)
target_compile_options(Drawbox PRIVATE -showIncludes)

target_compile_features(TestProgram PUBLIC cxx_std_11)
target_compile_options(TestProgram PRIVATE
)

target_link_libraries(TestProgram winmm.lib)

Я пытаюсь увидеть разницу между двумя сценариями CMake, которые могли бы объяснить эту проблему.
Где искать такую ​​проблему? Я хотел бы представить хороший подробный файл журнала, но мне понадобится помощь, чтобы узнать, как его создать. Но вот журнал чистой генерации CMake:
1> CMake generation started for configuration: 'x64-Debug'.
1> Command line: "C:\Windows\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="C:\Users\ken\Desktop\prog24\Drawboxish\install\x64-Debug" -DCMAKE_C_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.41.34120/bin/Hostx64/arm64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.41.34120/bin/Hostx64/arm64/cl.exe" -DCMAKE_MAKE_PROGRAM="C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" "C:\Users\ken\Desktop\prog24\Drawboxish" 2>&1"
1> Working directory: C:\Users\ken\Desktop\prog24\Drawboxish\build\x64-Debug
1> [CMake] -- Configuring done (0.2s)
1> [CMake] -- Generating done (0.0s)
1> [CMake] -- Build files have been written to: C:/Users/ken/Desktop/prog24/Drawboxish/build/x64-Debug
1> Extracted CMake variables.
1> Extracted source files and headers.
1> Extracted code model.
1> Extracted toolchain configurations.
1> Extracted includes paths.
1> CMake generation finished.

Вот TestCase.cpp.
#include
#include
#include
#include

SDL_Window* gWindow = NULL; //The window we'll be rendering to
SDL_Renderer* gRenderer = NULL; // Renders to an offscreen "texture" (frequent)
static SDL_Texture *target;
SDL_Event event;
TTF_Font *gFont;

void DrawNow();

int points[][2] = {
{50, 50},
{200, 100},
{50, 300},
{400, 400},
{300, 70},
{70, 450}
};

void DrawText(int x, int y, const char* text, SDL_Color fg) {
int width, height;

if (strlen(text) == 0) return;

SDL_Color bgColor = { 0xff, 0xff, 0xff, 0xff};
SDL_Surface* textSurface = TTF_RenderText_Blended(gFont, text, fg);
if( textSurface == NULL )
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
else {
//Create texture from surface pixels
SDL_Texture *mTexture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( mTexture == NULL ) {
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
} else {
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );

//Render to screen
int descent = TTF_FontDescent(gFont);
//printf("height: %d descent:%d\n", height, descent);
SDL_Rect renderQuad = { x, y-height-descent, width, height };
SDL_RenderCopy( gRenderer, mTexture, NULL, &renderQuad);
SDL_DestroyTexture(mTexture);
}
}

void TextTest() {
//Rectangle(30, 30, 140, 80, filled + blue);
SDL_Color c1 = {0xff, 0xff, 0x00, 0x00};
SDL_Color c2 = {0xff, 0x00, 0xff, 0x00};
DrawText(50, 50, "hello", c1);
DrawText(60, 55, "goodbye", c2);
DrawNow();
}

void AutoDraw() { // "User" graphics
SDL_Rect rr = {10, 10, 120, 120};
int outcome = SDL_RenderSetViewport(gRenderer, &rr);
filledCircleColor(gRenderer, 100, 100, 40, 0xff00ff00);
sleep(1);
DrawNow();
}

void DrawNow() {
while (SDL_PollEvent(&event)) {
}

SDL_SetRenderTarget(gRenderer, NULL);
SDL_RenderCopy(gRenderer, target, NULL, NULL);
SDL_RenderPresent(gRenderer);
SDL_SetRenderTarget(gRenderer, target);
}

bool drawbox_inited = false;

int main() {
if (! drawbox_inited) {
//Initialize SDL
if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) {
printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
return 1;
}
gWindow = SDL_CreateWindow("Drawbox", 0, 0, 1200, 900, 0);
if( gWindow == NULL ) {
printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
return -1;
}
//Create renderer for window
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
if( gRenderer == NULL )
{
printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
return -1;
}
/* Create texture for display buffering */
target = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 1200, 900);
SDL_SetRenderTarget(gRenderer, target);
//SDL_RenderSetLogicalSize(gRenderer, 2000, 1400);

//Clear buffer
SDL_SetRenderDrawColor( gRenderer, 0, 0, 0, 0xff );
SDL_RenderClear( gRenderer );

// Set up for fonts and text
if (TTF_Init() < 0) {
printf("ttf could not be initialized: %s\n", SDL_GetError());
} else {
gFont = TTF_OpenFont( "Cabin-Regular.ttf", 20 );
if( gFont == NULL )
{
printf( "Failed to load default font! SDL_ttf Error: %s\n", TTF_GetError() );
}
}

// handle window creation events: A MUST!
SDL_Event event;
while (SDL_PollEvent(&event)) {
// printf("Event: %d\n", event.type);
}
}

//ClearClip();

srand(time(NULL));

AutoDraw();
sleep(6);

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... d-includes
Ответить

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

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

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

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

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