GLFW 链接问题,因为它在 SharedLib (DLL) 中使用
Problem with GLFW linking, as it used in SharedLib (DLL)
环境:Visual Studio 2019.
我正在开发一个作为 SharedLib (DLL) 的引擎,我制作了一个使用此 DLL 的示例,以便我可以启动该引擎。在这个阶段,我必须将 GLFW 库添加到引擎中,因此我将 GLFW 作为子模块 (git) 添加到我的项目中,并将该库构建为 StaticLib (.lib),并将静态运行时设置为“On”。并在引擎中添加 GLFW 作为参考,如下面第二张图片所示。 GLFW 的构建非常顺利,我得到了 GLFW.lib。所以我将 GLFW 的一些函数添加到引擎代码中,例如 glfwMakeContextCurrent()
此时,当我构建引擎时,除了 glfwInit()
.
之外,许多函数都出现奇怪的链接错误
这是我的一个链接错误示例的图片:
项目视图:
注意:opengl32.lib 已添加到链接器输入中的引擎。
如果您有任何想法,请分享,我将不胜感激
编辑
这是完整的链接器命令行:
谢谢大家的帮助。我得到了一个相对的解决方案,我想与您分享以防有人遇到同样的情况。
Short Answer:
我在构建时将 GLFW 从静态库转换为共享库,链接错误就消失了。
Long Answer
我编写了一个 Premake 脚本来生成配置设置为 Shared Library
和 staticruntime
到 Off
的 GLFW 项目 [意思是(多线程 DLL (/MD))用于运行时Visual Studio 配置中的库]。除了一些包含和定义(看看脚本),我将 GLFW 库链接到引擎,我将 .dll 复制到基于引擎的 Sandbox/example 应用程序的位置,一切都很好。
以下是案例脚本:
project "GLFW"
kind "SharedLib"
language "C"
targetname ("glfw3")
targetdir ("bin/" .. outputdir .. "/%{prj.name}")
objdir ("bin-intermediate/" .. outputdir .. "/%{prj.name}")
files
{
"include/GLFW/glfw3.h",
"include/GLFW/glfw3native.h",
"src/internal.h",
"src/glfw_config.h",
"src/mappings.h",
"src/egl_context.h",
"src/osmesa_context.h",
"src/wgl_context.h",
"src/context.h",
"src/init.c",
"src/input.c",
"src/monitor.c",
"src/vulkan.c",
"src/window.c",
"src/context.c"
}
includedirs {
"%{prj.name}/src",
"%{prj.name}/include"
}
filter "system:windows"
buildoptions { "-std=c11", "-lgdi32" }
systemversion "latest"
staticruntime "Off"
files
{
"src/win32_platform.h",
"src/win32_joystick.h",
"src/win32_init.c",
"src/win32_joystick.c",
"src/win32_monitor.c",
"src/win32_time.c",
"src/win32_thread.c",
"src/win32_window.c",
"src/wgl_context.c",
"src/egl_context.c",
"src/osmesa_context.c"
}
defines
{
"_GLFW_WIN32",
"_CRT_SECURE_NO_WARNINGS",
"WIN32",
"_WINDOWS",
"UNICODE",
"_UNICODE",
"_GLFW_BUILD_DLL"
}
links{
"kernel32.lib",
"user32.lib",
"gdi32.lib",
"winspool.lib",
"shell32.lib",
"ole32.lib",
"oleaut32.lib",
"uuid.lib",
"comdlg32.lib",
"advapi32.lib"
}
postbuildcommands{
("{COPY} %{cfg.buildtarget.relpath} ../../../bin/" .. outputdir .. "/Sandbox")
}
filter { "system:windows", "configurations:Debug"}
buildoptions "/MDd"
filter { "system:windows", "configurations:Release"}
buildoptions "/MD"
环境:Visual Studio 2019.
我正在开发一个作为 SharedLib (DLL) 的引擎,我制作了一个使用此 DLL 的示例,以便我可以启动该引擎。在这个阶段,我必须将 GLFW 库添加到引擎中,因此我将 GLFW 作为子模块 (git) 添加到我的项目中,并将该库构建为 StaticLib (.lib),并将静态运行时设置为“On”。并在引擎中添加 GLFW 作为参考,如下面第二张图片所示。 GLFW 的构建非常顺利,我得到了 GLFW.lib。所以我将 GLFW 的一些函数添加到引擎代码中,例如 glfwMakeContextCurrent()
此时,当我构建引擎时,除了 glfwInit()
.
这是我的一个链接错误示例的图片:
项目视图:
注意:opengl32.lib 已添加到链接器输入中的引擎。
如果您有任何想法,请分享,我将不胜感激
编辑
这是完整的链接器命令行:
谢谢大家的帮助。我得到了一个相对的解决方案,我想与您分享以防有人遇到同样的情况。
Short Answer:
我在构建时将 GLFW 从静态库转换为共享库,链接错误就消失了。
Long Answer
我编写了一个 Premake 脚本来生成配置设置为 Shared Library
和 staticruntime
到 Off
的 GLFW 项目 [意思是(多线程 DLL (/MD))用于运行时Visual Studio 配置中的库]。除了一些包含和定义(看看脚本),我将 GLFW 库链接到引擎,我将 .dll 复制到基于引擎的 Sandbox/example 应用程序的位置,一切都很好。
以下是案例脚本:
project "GLFW"
kind "SharedLib"
language "C"
targetname ("glfw3")
targetdir ("bin/" .. outputdir .. "/%{prj.name}")
objdir ("bin-intermediate/" .. outputdir .. "/%{prj.name}")
files
{
"include/GLFW/glfw3.h",
"include/GLFW/glfw3native.h",
"src/internal.h",
"src/glfw_config.h",
"src/mappings.h",
"src/egl_context.h",
"src/osmesa_context.h",
"src/wgl_context.h",
"src/context.h",
"src/init.c",
"src/input.c",
"src/monitor.c",
"src/vulkan.c",
"src/window.c",
"src/context.c"
}
includedirs {
"%{prj.name}/src",
"%{prj.name}/include"
}
filter "system:windows"
buildoptions { "-std=c11", "-lgdi32" }
systemversion "latest"
staticruntime "Off"
files
{
"src/win32_platform.h",
"src/win32_joystick.h",
"src/win32_init.c",
"src/win32_joystick.c",
"src/win32_monitor.c",
"src/win32_time.c",
"src/win32_thread.c",
"src/win32_window.c",
"src/wgl_context.c",
"src/egl_context.c",
"src/osmesa_context.c"
}
defines
{
"_GLFW_WIN32",
"_CRT_SECURE_NO_WARNINGS",
"WIN32",
"_WINDOWS",
"UNICODE",
"_UNICODE",
"_GLFW_BUILD_DLL"
}
links{
"kernel32.lib",
"user32.lib",
"gdi32.lib",
"winspool.lib",
"shell32.lib",
"ole32.lib",
"oleaut32.lib",
"uuid.lib",
"comdlg32.lib",
"advapi32.lib"
}
postbuildcommands{
("{COPY} %{cfg.buildtarget.relpath} ../../../bin/" .. outputdir .. "/Sandbox")
}
filter { "system:windows", "configurations:Debug"}
buildoptions "/MDd"
filter { "system:windows", "configurations:Release"}
buildoptions "/MD"