在loongarch旧世界编译glslc

拉取git仓库参照readme源码编译;

1、编译时报错:

[609/1101] Linking CXX executable third_party/spirv-tools/tools/spirv-objdump
FAILED: third_party/spirv-tools/tools/spirv-objdump 
: && /usr/bin/c++ -D_GLIBCXX_USE_CXX11_ABI=0 -Wimplicit-fallthrough -O2 -g -DNDEBUG -lstdc++fs third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/extract_source.cpp.o third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/util/cli_consumer.cpp.o third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/util/flags.cpp.o -o third_party/spirv-tools/tools/spirv-objdump  third_party/spirv-tools/source/libSPIRV-Tools.a  -lrt && :
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1128':
objdump.cpp:(.text.startup+0x2fc): undefined reference to `std::filesystem::path::_M_split_cmpts()'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1148':
objdump.cpp:(.text.startup+0x3d0): undefined reference to `std::filesystem::path::_M_split_cmpts()'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1151':
objdump.cpp:(.text.startup+0x3e8): undefined reference to `std::filesystem::status(std::filesystem::path const&)'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LBE14054':
objdump.cpp:(.text.startup+0x400): undefined reference to `std::filesystem::create_directories(std::filesystem::path const&)'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1163':
objdump.cpp:(.text.startup+0x460): undefined reference to `std::filesystem::path::_M_split_cmpts()'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1192':
objdump.cpp:(.text.startup+0x5bc): undefined reference to `std::filesystem::path::has_root_directory() const'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1210':
objdump.cpp:(.text.startup+0x624): undefined reference to `std::filesystem::status(std::filesystem::path const&)'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1297':
objdump.cpp:(.text.startup+0x900): undefined reference to `std::filesystem::path::has_filename() const'
/usr/bin/ld: third_party/spirv-tools/tools/CMakeFiles/spirv-objdump.dir/objdump/objdump.cpp.o: in function `.LVL1314':
objdump.cpp:(.text.startup+0x97c): undefined reference to `std::filesystem::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
[618/1101] Building CXX object third_party/spirv-tools/test/CMakeFiles/test_spirv_unit_tests.dir/binary_parse_test.cpp.o
ninja: build stopped: subcommand failed.

原因:

这个错误显示链接器在构建 spirv-objdump 时遇到了 std::filesystem 未定义的引用。这通常是因为编译器或链接器的配置缺少对 std::filesystem 支持的正确链接标志。

刚开始尝试在 CMake 配置中显式添加-DCMAKE_CXX_STANDARD=17和-DCMAKE_EXE_LINKER_FLAGS="-lstdc++fs"发现还是不行,

cmake .. -DCMAKE_CXX_STANDARD=17 -DCMAKE_EXE_LINKER_FLAGS="-lstdc++fs"

于是找到spirv-objdump的camke配置,位置在third_party/spirv-tools/tools/CMakeLists.txt修改如下内容:

  if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Android"))
    add_spvtools_tool(TARGET spirv-objdump
                      SRCS objdump/objdump.cpp
                           objdump/extract_source.cpp
                           util/cli_consumer.cpp
                           ${COMMON_TOOLS_SRCS}
                      LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})

    # Ensure C++17 standard is used
    set_target_properties(spirv-objdump PROPERTIES CXX_STANDARD 17)
    set_target_properties(spirv-objdump PROPERTIES CXX_STANDARD_REQUIRED ON)

    # Link the stdc++fs library
    target_link_libraries(spirv-objdump PRIVATE stdc++fs)

    target_include_directories(spirv-objdump PRIVATE ${spirv-tools_SOURCE_DIR}
                                                     ${SPIRV_HEADER_INCLUDE_DIR})
    set(SPIRV_INSTALL_TARGETS ${SPIRV_INSTALL_TARGETS} spirv-objdump)
  endif()

还会有好几个包编译会出现这个问题,遇见一个找到对应的CMakeLists.txt显式添加就行,下面是关键:third_party/glslang/glslang/CMakeLists.txt一定要添加,不然glslc_exe和shaderc-online-compile会一直报找不到stdc++fs的错:undefined reference to `std::filesystem::

2、可能遇到编译内存不足的问题:

as: out of memory allocating 4064 bytes after a total of 11830460416 bytes

以下是几种可能的解决方案,可以尝试来减轻内存压力:

(1) 限制并行编译任务数量

Ninja 默认会使用系统上所有的CPU核心并行编译,但这会导致高内存占用。尝试指定一个较小的并行任务数,例如 -j4,可以降低内存使用:

ninja -j4

(2) 禁用测试构建

你可以尝试在 CMake 配置阶段禁用测试的构建,因为测试通常会产生大量对象文件并消耗内存。使用 -DSHADERC_SKIP_TESTS=ON 参数来跳过测试构建:

cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSHADERC_SKIP_TESTS=ON -DCMAKE_EXE_LINKER_FLAGS="-lstdc++fs" -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" ..

(3) 增加交换空间(Swap Space)

如果系统物理内存不足,增加交换空间可以帮助缓解内存不足的问题。使用以下命令创建一个 4GB 的交换文件:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

最后编译成功:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值