拉取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
最后编译成功: