1

语境

操作系统:Ubuntu 18.04

建造:CMake 3.10.2

编译器:gcc-9 (Ubuntu 9.2.1-17ubuntu1~18.04.1) 9.2.1 20191102

配置:x86_64,debug

行动

我升级到上述 gcc 版本并使用此编译器重新编译了所有第三方库和我的整个应用程序代码。所有库和应用程序都使用 编译-m64 -std=c++17,应用程序使用-stdc++fs

使用 GCC-8,一切都构建得很好,但是运行整个事情会导致 SEGFAULT at std::filesystem::current_path()after doing apt update, apt upgrade.

在此之前,整个应用程序已经成功运行。

错误

我收到后续的多个定义链接器错误(+ 一个未定义的引用错误)

CMakeFiles/shirabe_resource_compiler.dir/code/source/extraction.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/usr/include/c++/9/bits/shared_ptr_base.h:1118: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/extraction.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/usr/include/c++/9/bits/shared_ptr_base.h:1118: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/extraction.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/usr/include/c++/9/bits/shared_ptr_base.h:1118: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/extraction.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/usr/include/c++/9/bits/shared_ptr_base.h:1118: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/shadercompilationunit.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/nlohmann_json/linux64/debug/include/nlohmann/json.hpp:8916: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/shadercompilationunit.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/nlohmann_json/linux64/debug/include/nlohmann/json.hpp:8916: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/shadercompilationunit.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/nlohmann_json/linux64/debug/include/nlohmann/json.hpp:8916: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/shadercompilationunit.cpp.o: In function `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()':
/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/nlohmann_json/linux64/debug/include/nlohmann/json.hpp:8916: multiple definition of `std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()'
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o:/usr/include/c++/9/bits/shared_ptr_base.h:1118: first defined here
CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o: In function `std::filesystem::__cxx11::path::path(std::basic_string_view<char, std::char_traits<char> >, std::filesystem::__cxx11::path::_Type)':
/usr/include/c++/9/bits/fs_path.h:477: undefined reference to `std::filesystem::__cxx11::path::_List::type(std::filesystem::__cxx11::path::_Type)'
collect2: error: ld returned 1 exit status

更多上下文

COLLECT_GCC_OPTIONS 输出为:

COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-std=c++17' '-fexceptions' '-pthread' '-fPIE' '-m64' '-ggdb3' '-Wextra' '-Wno-extra-semi' '-Wno-reserved-id-macro' '-Wno-ignored-qualifiers' '-fkeep-inline-functions' '-fkeep-static-functions' '-g' '-o' '../../_deploy/linux64/debug/bin/shirabe_resource_compiler_x64d' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/_deploy/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_cross/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_tools/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/cryptopp/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/glslang/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/fmt/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/libxml2/linux64/debug/lib' '-L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/zlib/linux64/debug/lib' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/cc12pvJX.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o ../../_deploy/linux64/debug/bin/shirabe_resource_compiler_x64d /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/home/dotti/workspaces/shirabeengine/shirabeengine/_deploy/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_cross/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_tools/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/cryptopp/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/glslang/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/fmt/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/libxml2/linux64/debug/lib -L/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/zlib/linux64/debug/lib -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/shirabe_resource_compiler.dir/code/source/applicationmain.cpp.o CMakeFiles/shirabe_resource_compiler.dir/code/source/extraction.cpp.o CMakeFiles/shirabe_resource_compiler.dir/code/source/shadercompilationunit.cpp.o -rpath /home/dotti/workspaces/shirabeengine/shirabeengine/_deploy/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_cross/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/spirv_tools/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/cryptopp/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/glslang/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/fmt/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/libxml2/linux64/debug/lib:/home/dotti/workspaces/shirabeengine/shirabeengine/../thirdparty/_deploy/zlib/linux64/debug/lib --whole-archive ../../_deploy/linux64/debug/lib/libmaterial_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libasset_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libgraphicsapi_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libresources_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libmath_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libutility_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libcore_x64d_a.a --no-whole-archive --whole-archive ../../_deploy/linux64/debug/lib/libbase_x64d_a.a --no-whole-archive -lspirv-cross-core -lspirv-cross-cpp -lspirv-cross-glsl -lspirv-cross-msl -lspirv-cross-reflect -lspirv-cross-util -lcryptopp -lglslang -lOGLCompiler -lHLSL -lSPIRV -lSPVRemapper -lOSDependent -lfmtd -lxml2 -lz -ldl -lstdc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o

备注:我有一个更大的静态库列表,它们链接到一个公共共享对象中。之后的任何 -l 选项-dl都由 CMake 附加,我不设置它们。

我已经做了什么

  • 当我从 GCC-8 升级时,我删除-lstdc++fs并替换了所有出现的#include <experimental/filesystem>with#include <filesystem>并更新了所有引用和命名空间用法
  • 我删除了所有第三方源、构建文件和部署输出并重新获取源并从头开始完全重建
  • 我清理了标头包含和源,删除了未使用的包含、定义和函数等 --> 没有效果
  • 我分析了链接器错误并进nlohmann::json入库并搜索了 std::shared_ptr<std::filesystem ...--> 没有发现
  • .o我分析了受列出的三个文件影响的源代码和它包含的代码。--> 没有 std::shared_ptr<std::filesystem ...找到
  • 我检查了所有隐式转换std::filesystem::...std::shared_ptr<...--​​>没有找到
  • 我浏览了我最近更改的所有文件以查找错误<>以及任何语法关键字-> 没有找到
  • 我在 SO 上浏览了许多关于多个定义错误的帖子,随后确保所有内容都是使用相同的编译器和选项构建的。-->Unsolved

短的

我无法解释为什么代码失败。

停!

我被困在这一点上。有没有人事先遇到过这样的问题?

我很感激有关如何追踪此问题的任何线索。

更新

按照 nm 的建议,我执行了nm -C extraction.cpp.o | grep _Dir

0000000000000000 W bool std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::owner_before<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack>(std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2> const&) const
0000000000000000 W bool std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::owner_before<std::filesystem::__cxx11::_Dir>(std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2> const&) const
                 U std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr(std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>&&)
00000000000005c4 T std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()
000000000000059a T std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()
0000000000000000 W std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()
0000000000000000 W std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()
0000000000000000 n std::__shared_ptr<std::filesystem::__cxx11::recursive_directory_iterator::_Dir_stack, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()
                 U std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr(std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>&&)
0000000000000570 T std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()
0000000000000546 T std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::__shared_ptr()
0000000000000000 W std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()
0000000000000000 W std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()
0000000000000000 n std::__shared_ptr<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr()

是的,弱符号...

更新 2

似乎是我使用的 GCC-9 的非官方发行版中的编译器错误。回到 GCC-8 并进行了一些修复,问题得到解决。


为了获得更好的 PHP 7.3 体验,您可以简单地将其升级到 Laravel 5.2。它适用于 PHP 7.3 环境。

4

0 回答 0