Использование библиотек SDL2 с компилятором cl.exe

В настоящее время я пытаюсь скомпилировать файл С++ с помощью кода Visual Studio, и я попытался отредактировать файл c_cpp_properties.json, добавив включаемые папки в переменную includePath, и файл tasks.json, добавив аргументы, но я все еще не могу скомпилировать, это дает мне эту ошибку:

ССЫЛКА: фатальная ошибка LNK1104: не удается открыть «SDL2.lib»

Вот файлы:

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\vclib\\include\\",
                "C:\\vclib\\SDL2_image-2.0.5\\include\\"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.18362.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64"
        }
    ],
    "version": 4
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: cl.exe build active file",
            "command": "cl.exe",
            "args": [
                "/Zi",
                "/EHsc",
                "/Fe:",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "/IC:\\vclib\\include",
                "/IC:\\vclib\\SDL2_image-2.0.5\\include",
                "${file}",
                "SDL2.lib", "SDL2main.lib", "SDL2_image.lib",
                "/link /LIBPATH:C:\\vclib\\lib\\x64;C:\\vclib\\SDL2_image-2.0.5\\lib\\x64",
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

ОБНОВЛЕНИЕ: второй файл теперь выглядит так:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: cl.exe build active file",
            "command": "cl.exe",
            "args": [
                "/Zi",
                "/EHsc",
                "/Fe:",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "${file}",
                "SDL2.lib", "SDL2main.lib","SDL2_image.lib",
                "/IC:\\vclib\\include",
                "/IC:\\vclib\\SDL2_image-2.0.5\\include",
                "/link /LIBPATH:C:\\vclib\\lib\\x86", "/LIBPATH:C:\\vclib\\SDL2_image-2.0.5\\lib\\x86",
                "/SUBSYSTEM:CONSOLE"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

Теперь у меня есть эта ошибка:

SDL2main.lib(SDL_windows_main.obj): ошибка LNK2019: внешний символ не разрешен __imp__CommandLineToArgvW@8, на который ссылается функция _main_getcmdline


person Alessandro    schedule 07.09.2020    source источник
comment
Невозможно открыть библиотеку обычно означает одно или несколько из следующего: 1. Вы ввели неверный путь или имя, 2. Вы смешиваете 32- и 64-разрядную версию или 3. Файл библиотеки поврежден.   -  person drescherjm    schedule 07.09.2020
comment
Я предполагаю, что вы создаете 32-битное приложение, но пытаетесь связать 64-битные библиотеки.   -  person drescherjm    schedule 07.09.2020
comment
Обратите внимание, что c_cpp_properties.json не влияет на компиляцию.   -  person Alan Birtles    schedule 07.09.2020
comment
@drescherjm вы были правы насчет 2. Я использовал 64-битные библиотеки с 32-битным приложением. Я обновил свой вопрос.   -  person Alessandro    schedule 07.09.2020
comment
@AlanBirtles Когда я редактирую файл, результат другой, поэтому в моем случае это, похоже, влияет на компиляцию.   -  person Alessandro    schedule 07.09.2020
comment
Если ошибка, которую вы показываете, единственная, то все, что вам нужно, это включить библиотеку Shell32.lib, но я подозреваю, что этого будет достаточно. только ошибки ссылки могут сказать вам, что вам нужно.   -  person metablaster    schedule 07.09.2020
comment
c_cpp_properties.json управляет только intellisense, командные строки в tasks.json выполняют компиляцию   -  person Alan Birtles    schedule 07.09.2020


Ответы (1)


У меня была такая же проблема, и в конце концов я заставил ее работать, используя некоторые ответы, приведенные здесь: Скомпилируйте программу C/SDL с помощью Visual C++ 2013 из командной строки

Мой c_cpp_properties.json выглядит так:

{
"configurations": [
    {
        "name": "Win32",
        "includePath": [
            "${workspaceFolder}/**",
            "G:/SDL2/include/",
            "G:/SDL2/lib/x86/"
        ],
        "defines": [
            "_DEBUG",
            "UNICODE",
            "_UNICODE"
    
        ],
        "windowsSdkVersion": "10.0.17763.0",
        "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
        "cStandard": "c17",
        "cppStandard": "c++17",
        "intelliSenseMode": "windows-msvc-x64"
    }
],
"version": 4
}

Мой файл tasks.json выглядит так:

{
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: cl.exe build active file",
        "command": "cl.exe",
        "args": [
            "/Zi",
            "/EHsc",
            "/nologo",
            "/Fe:",
            "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "${file}",
            "/I G:\\SDL2\\include\\",
            "/link G:\\SDL2\\lib\\x86\\SDL2main.lib G:\\SDL2\\lib\\x86\\SDL2.lib"
        ],
        "options": {
            "cwd": "${workspaceFolder}"
        },
        "problemMatcher": [
            "$msCompile"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "detail": "Task generated by Debugger."
    }
],
"version": "2.0.0"
}

Некоторое время это не работало, пока я не вспомнил о том, чтобы поместить двоичный файл среды выполнения SDL2.dll в каталог рабочей области. И в том числе:

#define SDL_MAIN_HANDLED
#include <G:\SDL2\include\SDL.h>

Который я получил от Нужна ли мне функция main() SDL?

person willy_64    schedule 21.05.2021