Я использую 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 напрямую как проект в свои решения, но, если возможно, я хотел бы избежать этого, поскольку я планирую добавлять дополнительные библиотеки в будущем и хочу избежать раздувания.
"gdi32", -- For GLFW on Windows Так что можно заходить подходящее filter.
@Jarod42 Я создал простое консольное приложение, а затем попытался связать glfw с исполняемым файлом. Но я получаю те же ошибки связывания («неразрешенный внешний символ»). Не знаю, делаю ли я что-то не так или забываю связать что-то, кроме тех, что указаны в моем списке «ссылок».
Определен ли GLFW_DLL (для обработки dll_import вещей) в исходном коде? иначе потребуется defines "GLFW_DLL".
«Я создал простое консольное приложение». Затем я опубликую его предварительный код и исходный код.
В качестве альтернативы, nuget {"glfw:3.4.0"} должен выполнять работу для действия vs_2022.
@Jarod42 Jarod42 Я пытаюсь статически связать готовые двоичные файлы. Но я думаю, что мои ошибки происходят из-за того, что я пытаюсь связать их динамически? (в dll). На самом деле я не знаю, как это сказать или заставить статически ссылаться. Попробовал добавить defines { "GLFW_STATIC" }, но это ничего не дало.





Похоже, проблема решена связыванием с многопоточной версией GLFW (glfw3_mt) вместо стандартной версии (glfw3).
-- Link against the multi-threaded version of GLFW
links
{
"glfw3_mt"
}
Я бы переместил
links {..}(иlibdirs) в исполняемый проект (т. е.project "Game".