godotengine / godot

Godot Engine – Multi-platform 2D and 3D game engine
https://godotengine.org
MIT License
90.35k stars 21.06k forks source link

Undefined reference/symbol for dynamically linked glslang module #44536

Closed LinuxUserGD closed 2 years ago

LinuxUserGD commented 3 years ago

Godot version:

godot.linuxbsd.opt.tools.64.llvm --version
4.0.dev.custom_build.a511a26ad

glslangValidator --version
Glslang Version: 10:11.0.0
ESSL Version: OpenGL ES GLSL 3.20 glslang Khronos. 11.0.0
GLSL Version: 4.60 glslang Khronos. 11.0.0
SPIR-V Version 0x00010500, Revision 4
GLSL.std.450 Version 100, Revision 1
Khronos Tool ID 8
SPIR-V Generator Version 10
GL_KHR_vulkan_glsl version 100
ARB_GL_gl_spirv version 100

clang --version
clang version 11.0.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm/11/bin

OS/device including version:

Gentoo Linux

Issue description:

Compiling godot on gentoo with this ebuild: https://cgit.gentoo.org/repo/user/Drauthius.git/tree/dev-games/godot/godot-9999.ebuild?id=4034cbc02a58c457e29973bfad3e3b6f875e12dd (flags below) doesn't work with dynamically linked external glslang.

MYSCONS=(
        CC="$(tc-getCC)"
        CXX="$(tc-getCXX)"
        builtin_enet=$(usex enet)
        builtin_freetype=no
        builtin_glslang=no
        builtin_libogg=no
        builtin_libpng=no
        builtin_libtheora=$(usex theora)
        builtin_libvorbis=$(usex vorbis)
        builtin_libvpx=no
        builtin_libwebp=$(usex webp)
        builtin_mbedtls=$(usex mbedtls)
        builtin_miniupnpc=no
        builtin_opus=$(usex opus)
        builtin_pcre2=no
        builtin_vulkan=$(usex vulkan)
        builtin_zlib=no
        builtin_zstd=no
        module_enet_enabled=$(usex enet)
        module_freetype_enabled=$(usex freetype)
        module_mbedtls_enabled=$(usex mbedtls)
        module_opus_enabled=$(usex opus)
        module_theora_enabled=$(usex theora)
        module_vorbis_enabled=$(usex vorbis)
        module_webp_enabled=$(usex webp)
        platform=$(usex X linuxbsd server)
        pulseaudio=$(usex pulseaudio)
        tools=yes
        progress=false
        verbose=true
        udev=$(usex udev)
        use_llvm=$(usex llvm)
        use_lld=$(usex llvm)
        use_lto=$(usex lto)
        target=$(usex debug debug release_debug)
    )

However it compiles fine with these additional flags: -L/usr/lib64/ -lglslang-default-resource-limits

Steps to reproduce:

Output1:

llvm.a modules/libmodule_dds.linuxbsd.opt.tools.64.llvm.a modules/libmodule_cvtt.linuxbsd.opt.tools.64.llvm.a modules/libmodule_csg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bullet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bmp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_basis_universal.linuxbsd.opt.tools.64.llvm.a modules/libmodule_assimp.linuxbsd.opt.tools.64.llvm.a platform/libplatform.linuxbsd.opt.tools.64.llvm.a drivers/libdrivers.linuxbsd.opt.tools.64.llvm.a editor/libeditor.linuxbsd.opt.tools.64.llvm.a scene/libscene.linuxbsd.opt.tools.64.llvm.a servers/libservers.linuxbsd.opt.tools.64.llvm.a core/libcore.linuxbsd.opt.tools.64.llvm.a modules/freetype/libfreetype_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libharfbuzz_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libgraphite_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libicu_builtin.linuxbsd.opt.tools.64.llvm.a -lXcursor -lXinerama -lXext -lXrandr -lXrender -lX11 -lXi -lzstd -lvpx -lm -logg -lminiupnpc -lpcre2-32 -lasound -lpulse -ludev -lglslang -lSPIRV -lGL -lpthread -ldl
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)':
/var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:73: undefined reference to `glslang::DefaultTBuiltInResource'
/usr/bin/x86_64-pc-linux-gnu-ld: /var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:73: undefined reference to `glslang::TShader::preprocess(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, glslang::TShader::Includer&)'
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `glslang::TShader::parse(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages)':
/usr/include/glslang/Public/ShaderLang.h:633: undefined reference to `glslang::DefaultTBuiltInResource'
/usr/bin/x86_64-pc-linux-gnu-ld: modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a(register_types.linuxbsd.opt.tools.64.llvm.o): in function `_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)':
/var/tmp/portage/dev-games/godot-9999/work/godot-9999/modules/glslang/register_types.cpp:116: undefined reference to `glslang::GlslangToSpv(glslang::TIntermediate const&, std::vector<unsigned int, std::allocator<unsigned int> >&, spv::SpvBuildLogger*, glslang::SpvOptions*)'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
scons: *** [bin/godot.linuxbsd.opt.tools.64.llvm] Error 1
scons: building terminated because of errors.
 * ERROR: dev-games/godot-9999::gentoo failed (compile phase):
 *   escons failed.

Output2:

clang++ -o bin/godot.linuxbsd.opt.tools.64.llvm -O2 -pipe -L/usr/lib64/ -lglslang-default-resource-limits -fuse-ld=lld -pipe -no-pie platform/linuxbsd/godot_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/crash_handler_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/os_linuxbsd.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/joypad_linux.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/context_gl_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/detect_prime_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/display_server_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/vulkan_context_x11.linuxbsd.opt.tools.64.llvm.o platform/linuxbsd/key_mapping_x11.linuxbsd.opt.tools.64.llvm.o main/libmain.linuxbsd.opt.tools.64.llvm.a modules/libmodules.linuxbsd.opt.tools.64.llvm.a modules/libmodule_xatlas_unwrap.linuxbsd.opt.tools.64.llvm.a modules/libmodule_websocket.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webrtc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_webm.linuxbsd.opt.tools.64.llvm.a modules/libmodule_vorbis.linuxbsd.opt.tools.64.llvm.a modules/libmodule_visual_script.linuxbsd.opt.tools.64.llvm.a modules/libmodule_vhacd.linuxbsd.opt.tools.64.llvm.a modules/libmodule_upnp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_tinyexr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_theora.linuxbsd.opt.tools.64.llvm.a modules/libmodule_tga.linuxbsd.opt.tools.64.llvm.a modules/libmodule_text_server_adv.linuxbsd.opt.tools.64.llvm.a modules/libmodule_svg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_stb_vorbis.linuxbsd.opt.tools.64.llvm.a modules/libmodule_squish.linuxbsd.opt.tools.64.llvm.a modules/libmodule_regex.linuxbsd.opt.tools.64.llvm.a modules/libmodule_pvr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_opus.linuxbsd.opt.tools.64.llvm.a modules/libmodule_opensimplex.linuxbsd.opt.tools.64.llvm.a modules/libmodule_ogg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_mobile_vr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_minimp3.linuxbsd.opt.tools.64.llvm.a modules/libmodule_meshoptimizer.linuxbsd.opt.tools.64.llvm.a modules/libmodule_mbedtls.linuxbsd.opt.tools.64.llvm.a modules/libmodule_lightmapper_rd.linuxbsd.opt.tools.64.llvm.a modules/libmodule_jsonrpc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_jpg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_hdr.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gridmap.linuxbsd.opt.tools.64.llvm.a modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdscript.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdnavigation.linuxbsd.opt.tools.64.llvm.a modules/libmodule_gdnative.linuxbsd.opt.tools.64.llvm.a modules/libmodule_freetype.linuxbsd.opt.tools.64.llvm.a modules/libmodule_etc.linuxbsd.opt.tools.64.llvm.a modules/libmodule_enet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_denoise.linuxbsd.opt.tools.64.llvm.a modules/libmodule_dds.linuxbsd.opt.tools.64.llvm.a modules/libmodule_cvtt.linuxbsd.opt.tools.64.llvm.a modules/libmodule_csg.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bullet.linuxbsd.opt.tools.64.llvm.a modules/libmodule_bmp.linuxbsd.opt.tools.64.llvm.a modules/libmodule_basis_universal.linuxbsd.opt.tools.64.llvm.a modules/libmodule_assimp.linuxbsd.opt.tools.64.llvm.a platform/libplatform.linuxbsd.opt.tools.64.llvm.a drivers/libdrivers.linuxbsd.opt.tools.64.llvm.a editor/libeditor.linuxbsd.opt.tools.64.llvm.a scene/libscene.linuxbsd.opt.tools.64.llvm.a servers/libservers.linuxbsd.opt.tools.64.llvm.a core/libcore.linuxbsd.opt.tools.64.llvm.a modules/freetype/libfreetype_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libharfbuzz_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libgraphite_builtin.linuxbsd.opt.tools.64.llvm.a modules/text_server_adv/libicu_builtin.linuxbsd.opt.tools.64.llvm.a -lXcursor -lXinerama -lXext -lXrandr -lXrender -lX11 -lXi -lzstd -lvpx -lm -logg -lminiupnpc -lpcre2-32 -lasound -lpulse -ludev -lglslang -lSPIRV -lGL -lpthread -ldl
Building compilation database compile_commands.json
progress_finish(["progress_finish"], [])
ld.lld: error: undefined symbol: glslang::TShader::preprocess(TBuiltInResource const*, int, EProfile, bool, bool, EShMessages, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, glslang::TShader::Includer&)
>>> referenced by register_types.cpp:73 (modules/glslang/register_types.cpp:73)
>>>               register_types.linuxbsd.opt.tools.64.llvm.o:(_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)) in archive modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a

ld.lld: error: undefined symbol: glslang::GlslangToSpv(glslang::TIntermediate const&, std::vector<unsigned int, std::allocator<unsigned int> >&, spv::SpvBuildLogger*, glslang::SpvOptions*)
>>> referenced by register_types.cpp:116 (modules/glslang/register_types.cpp:116)
>>>               register_types.linuxbsd.opt.tools.64.llvm.o:(_compile_shader_glsl(RenderingDevice::ShaderStage, String const&, RenderingDevice::ShaderLanguage, String*)) in archive modules/libmodule_glslang.linuxbsd.opt.tools.64.llvm.a
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
scons: *** [bin/godot.linuxbsd.opt.tools.64.llvm] Error 1
scons: building terminated because of errors.
 * ERROR: dev-games/godot-9999::gentoo failed (compile phase):
 *   escons failed.
LinuxUserGD commented 3 years ago

Possibly related:

-https://github.com/KhronosGroup/glslang/pull/2419 (glslang upstream) -https://github.com/KhronosGroup/glslang/issues/2283 (glslang upstream) -https://github.com/godotengine/godot-proposals/issues/1796

Additionally to the mentioned flags above, adding

local cmakeargs=(
        -DBUILD_SHARED_LIBS=ON
        )

to the glslang configure stage with this modified patch (changed STATIC to SHARED)

glslang.patch

```swift From d6e59ca08971c261f8297027d9c274f884c9d1e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Mon, 12 Oct 2020 11:20:05 +0200 Subject: [PATCH 1/2] CMake: Make glslang-default-resource-limits STATIC --- StandAlone/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt index 8038c043..a2009165 100644 --- a/StandAlone/CMakeLists.txt +++ b/StandAlone/CMakeLists.txt @@ -31,7 +31,7 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -add_library(glslang-default-resource-limits +add_library(glslang-default-resource-limits SHARED ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp) set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang) -- 2.30.0.383.g1c29ac3944.dirty From 5868365b3a8636a468c4d12b20a221f5b7602de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Mon, 12 Oct 2020 11:21:05 +0200 Subject: [PATCH 2/2] CMake: Use VERSION/SOVERSION for all shared libs --- SPIRV/CMakeLists.txt | 14 ++++++++++---- StandAlone/CMakeLists.txt | 7 +++++-- hlsl/CMakeLists.txt | 7 +++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/SPIRV/CMakeLists.txt b/SPIRV/CMakeLists.txt index d699dadd..55d77c45 100644 --- a/SPIRV/CMakeLists.txt +++ b/SPIRV/CMakeLists.txt @@ -69,8 +69,11 @@ set(SPVREMAP_HEADERS doc.h) add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS}) -set_property(TARGET SPIRV PROPERTY FOLDER glslang) -set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON) +set_target_properties(SPIRV PROPERTIES + FOLDER glslang + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") target_include_directories(SPIRV PUBLIC $ $) @@ -79,8 +82,11 @@ glslang_add_build_info_dependency(SPIRV) if (ENABLE_SPVREMAPPER) add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS}) - set_property(TARGET SPVRemapper PROPERTY FOLDER glslang) - set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON) + set_target_properties(SPVRemapper PROPERTIES + FOLDER glslang + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") endif() if(WIN32 AND BUILD_SHARED_LIBS) diff --git a/StandAlone/CMakeLists.txt b/StandAlone/CMakeLists.txt index a2009165..6ff5e65b 100644 --- a/StandAlone/CMakeLists.txt +++ b/StandAlone/CMakeLists.txt @@ -34,8 +34,11 @@ add_library(glslang-default-resource-limits STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp) -set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang) -set_property(TARGET glslang-default-resource-limits PROPERTY POSITION_INDEPENDENT_CODE ON) +set_target_properties(glslang-default-resource-limits PROPERTIES + FOLDER glslang + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") target_include_directories(glslang-default-resource-limits PUBLIC $ diff --git a/hlsl/CMakeLists.txt b/hlsl/CMakeLists.txt index 62faa195..a5472e7e 100644 --- a/hlsl/CMakeLists.txt +++ b/hlsl/CMakeLists.txt @@ -38,8 +38,11 @@ # projects that referenced this target. add_library(HLSL ${LIB_TYPE} "stub.cpp") -set_property(TARGET HLSL PROPERTY FOLDER hlsl) -set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON) +set_target_properties(HLSL PROPERTIES + FOLDER hlsl + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") if(WIN32 AND BUILD_SHARED_LIBS) set_target_properties(HLSL PROPERTIES PREFIX "") -- 2.30.0.383.g1c29ac3944.dirty ```

as a workaround fixes the compilation problem in Godot including linkage.

akien-mga commented 3 years ago

Can you still reproduce this in the current master branch?

LinuxUserGD commented 2 years ago

Can you still reproduce this in the current master branch?

Current master branch compiles fine now with -lglslang, fixed by https://github.com/godotengine/godot/pull/56722