Связывание GLFW со статической библиотекой с помощью Premake

Я использую Premake для управления конфигурацией сборки моего проекта, который состоит из двух статических библиотек («Engine» и «Game») и исполняемого файла («Launcher»). Но когда я пытаюсь интегрировать/связать GLFW с моей библиотекой Engine, я сталкиваюсь с ошибками связывания.

Должен упомянуть, что я пытаюсь статически связать GLFW. Я также использую Visual Studio 2022 на платформе Windows.

2>------ Build started: Project: Launcher, Configuration: Debug x64 ------
2>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
2>LINK : warning LNK4217: symbol 'strncmp' defined in 'libucrtd.lib(strncmp.obj)' is imported by 'Engine.lib(init.obj)' in function '_glfwParseUriList'
2>LINK : warning LNK4286: symbol 'strncmp' defined in 'libucrtd.lib(strncmp.obj)' is imported by 'Engine.lib(input.obj)'
2>LINK : warning LNK4286: symbol 'strncmp' defined in 'libucrtd.lib(strncmp.obj)' is imported by 'Engine.lib(context.obj)'
2>LINK : warning LNK4286: symbol 'strncmp' defined in 'libucrtd.lib(strncmp.obj)' is imported by 'Engine.lib(egl_context.obj)'
2>LINK : warning LNK4217: symbol 'free' defined in 'libucrtd.lib(free.obj)' is imported by 'Engine.lib(init.obj)' in function 'defaultDeallocate'
2>LINK : warning LNK4217: symbol 'free' defined in 'libucrtd.lib(free.obj)' is imported by 'Engine.lib(null_init.obj)' in function '_glfwConnectNull'
2>LINK : warning LNK4217: symbol 'malloc' defined in 'libucrtd.lib(malloc.obj)' is imported by 'Engine.lib(init.obj)' in function 'defaultAllocate'
2>LINK : warning LNK4217: symbol 'strtol' defined in 'libucrtd.lib(strtox.obj)' is imported by 'Engine.lib(init.obj)' in function '_glfwParseUriList'
2>LINK : warning LNK4217: symbol '__stdio_common_vsprintf' defined in 'libucrtd.lib(output.obj)' is imported by 'Engine.lib(init.obj)' in function '_glfwInputError'
2>LINK : warning LNK4217: symbol '__stdio_common_vsprintf' defined in 'libucrtd.lib(output.obj)' is imported by 'Engine.lib(win32_joystick.obj)' in function '_glfwDetectJoystickConnectionWin32'
2>LINK : warning LNK4217: symbol 'strcspn' defined in 'libucrtd.lib(strcspn.obj)' is imported by 'Engine.lib(input.obj)' in function 'glfwUpdateGamepadMappings'
2>LINK : warning LNK4217: symbol 'strtoul' defined in 'libucrtd.lib(strtox.obj)' is imported by 'Engine.lib(input.obj)' in function 'parseMapping'
2>LINK : warning LNK4217: symbol 'qsort' defined in 'libucrtd.lib(qsort.obj)' is imported by 'Engine.lib(monitor.obj)' in function 'refreshVideoModes'
2>LINK : warning LNK4217: symbol 'qsort' defined in 'libucrtd.lib(qsort.obj)' is imported by 'Engine.lib(win32_joystick.obj)' in function 'deviceCallback'
2>Engine.lib(init.obj) : error LNK2019: unresolved external symbol __imp_strtok referenced in function _glfwParseUriList
2>Engine.lib(init.obj) : error LNK2019: unresolved external symbol __imp_realloc referenced in function defaultReallocate
2>Engine.lib(window.obj) : error LNK2019: unresolved external symbol __imp_strncpy referenced in function glfwWindowHintString
2>Engine.lib(input.obj) : error LNK2001: unresolved external symbol __imp_strncpy
2>Engine.lib(monitor.obj) : error LNK2001: unresolved external symbol __imp_strncpy
2>Engine.lib(win32_joystick.obj) : error LNK2001: unresolved external symbol __imp_strncpy
2>Engine.lib(input.obj) : error LNK2019: unresolved external symbol __imp_strspn referenced in function glfwUpdateGamepadMappings
2>Engine.lib(input.obj) : error LNK2019: unresolved external symbol __imp_fmaxf referenced in function glfwGetGamepadState
2>Engine.lib(input.obj) : error LNK2019: unresolved external symbol __imp_fminf referenced in function glfwGetGamepadState
2>Engine.lib(monitor.obj) : error LNK2001: unresolved external symbol __imp_fminf
2>Engine.lib(null_monitor.obj) : error LNK2001: unresolved external symbol __imp_fminf
2>Engine.lib(context.obj) : error LNK2019: unresolved external symbol __imp___stdio_common_vsscanf referenced in function sscanf
2>..\bin\Debug-windows-x86_64\Launcher\Launcher.exe : fatal error LNK1120: 7 unresolved externals
2>Done building project "Launcher.vcxproj" -- FAILED.

Это мой текущий предварительный сценарий (премейк 5):

workspace "A_Seaside_Resort"
    configurations { "Debug", "Release" }
    architecture "x64"
    startproject "Launcher"

    outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}" 

project "Engine"
    location "Engine"
    kind "StaticLib"
    language "C++"
    cppdialect "C++20"
    staticruntime "on"

    targetdir ("bin/" .. outputdir .. "/%{prj.name}")
    objdir ("bin-int/" .. outputdir .. "/%{prj.name}")

    files { "%{prj.name}/Source/**.h", "%{prj.name}/Source/**.hpp", "%{prj.name}/Source/**.cpp" }

    defines { "GLEW_STATIC" }

    includedirs
    {
        "ThirdParty/GLFW/include"
    }

    libdirs
    {
        "ThirdParty/GLFW/lib-vc2022"
    }

    links
    {
        "glfw3",
        "opengl32",
        "gdi32",      -- For GLFW on Windows
        "user32",     -- For GLFW on Windows
        "kernel32",   -- For GLFW on Windows
        "ole32"       -- For GLFW on Windows
    }

    filter "system:windows"
        systemversion "latest"

    filter "configurations:Debug"
        runtime "Debug"
        symbols "on"

    filter "configurations:Release"
        runtime "Release"
        optimize "on"

project "Game"
    location "Game"
    kind "StaticLib"
    language "C++"
    cppdialect "C++20"
    staticruntime "On"

    --targetname ("%{prj.name}")
    targetdir ("bin/" .. outputdir .. "/%{prj.name}")
    objdir ("bin-int/" .. outputdir .. "/%{prj.name}")

    files { "%{prj.name}/Source/**.h", "%{prj.name}/Source/**.hpp", "%{prj.name}/Source/**.cpp" }

    includedirs
    {
        "Engine/Source"
    }

    links
    {
        "Engine"
    }

    filter "system:windows"
        systemversion "latest"
    
    filter "configurations:Debug"
        defines "Debug"
        symbols "on"

    filter "configurations:Release"
        defines "Release"
        optimize "on"

project "Launcher"
    location "Launcher"
    kind "ConsoleApp"
    language "C++"
    cppdialect "C++20"
    staticruntime "on"

    targetdir ("bin/" .. outputdir .. "/%{prj.name}")
    objdir ("bin-int/" .. outputdir .. "/%{prj.name}")

    files { "%{prj.name}/Source/**.h", "%{prj.name}/Source/**.hpp", "%{prj.name}/Source/**.cpp" }

    includedirs
    {       
        "Engine/Source",
        "Game/Source"
    }

    links
    {
        "Engine",
        "Game"
    }

    filter "system:windows"
        systemversion "latest"
    
    filter "configurations:Debug"
        defines "Debug"
        symbols "on"

    filter "configurations:Release"
        defines "Release"
        optimize "on"

Я новичок в использовании Premake, поэтому не совсем понимаю, что делаю неправильно. Я заметил, что некоторые разработчики интегрируют GLFW напрямую как проект в свои решения, но, если возможно, я хотел бы избежать этого, поскольку я планирую добавлять дополнительные библиотеки в будущем и хочу избежать раздувания.

Я бы переместил links {..}libdirs) в исполняемый проект (т. е. project "Game".

Jarod42 01.04.2024 17:10
"gdi32", -- For GLFW on Windows Так что можно заходить подходящее filter.
Jarod42 01.04.2024 17:11

@Jarod42 Я создал простое консольное приложение, а затем попытался связать glfw с исполняемым файлом. Но я получаю те же ошибки связывания («неразрешенный внешний символ»). Не знаю, делаю ли я что-то не так или забываю связать что-то, кроме тех, что указаны в моем списке «ссылок».

Henrik 01.04.2024 20:52

Определен ли GLFW_DLL (для обработки dll_import вещей) в исходном коде? иначе потребуется defines "GLFW_DLL".

Jarod42 02.04.2024 14:47

«Я создал простое консольное приложение». Затем я опубликую его предварительный код и исходный код.

Jarod42 02.04.2024 14:49

В качестве альтернативы, nuget {"glfw:3.4.0"} должен выполнять работу для действия vs_2022.

Jarod42 02.04.2024 14:51

@Jarod42 Jarod42 Я пытаюсь статически связать готовые двоичные файлы. Но я думаю, что мои ошибки происходят из-за того, что я пытаюсь связать их динамически? (в dll). На самом деле я не знаю, как это сказать или заставить статически ссылаться. Попробовал добавить defines { "GLFW_STATIC" }, но это ничего не дало.

Henrik 03.04.2024 22:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
7
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Похоже, проблема решена связыванием с многопоточной версией GLFW (glfw3_mt) вместо стандартной версии (glfw3).

-- Link against the multi-threaded version of GLFW
links
{
    "glfw3_mt"
}

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