Project

General

Profile

Actions

Emulator Issues #11047

closed

Compilation problems in Fedora 28 / GCC 8 / C++17

Added by lucag_73 almost 6 years ago. Updated about 5 years ago.

Status:
Working as intended
Priority:
Normal
Assignee:
-
% Done:

0%

Operating system:
N/A
Issue type:
Bug
Milestone:
Current
Regression:
No
Relates to usability:
No
Relates to performance:
No
Easy:
No
Relates to maintainability:
No
Regression start:
Fixed in:

Description

Hello,
I have found some compilation issues on Fedora 28
1) the function _xgetbv(u32 index) is now defined in a system header file; I had to disable the inclusion of such file with a
#define _XSAVEINTRIN_H_INCLUDED
in Source/Core/Common/x64CPUDetect.cpp
2) there is some incompatibility between the way c++17 is implemented by gcc 8 and what is in Source/Core/DiscIO/VolumeGC.cpp
I had to force -std=c++14 in order to complete compilation

With these two changes I managed to get a runnable version of dolphin (6e62d1ab9f70bffef612d1c6c6bcfbc2958af2a6), however I understand that the code should get somehow fixed.


Related issues 1 (0 open1 closed)

Has duplicate Emulator - Emulator Issues #11021: Dolphin does not compile with gcc-8Duplicate

Actions
Actions #1

Updated by JosJuice almost 6 years ago

  • Tracker changed from Issue to Emulator Issues
  • Project changed from Infrastructure to Emulator
  • Issue type set to Bug
  • Regression set to No
  • Relates to usability set to No
  • Relates to performance set to No
  • Easy set to No
  • Relates to maintainability set to No
  • Operating system N/A added
Actions #2

Updated by leoetlino almost 6 years ago

It would be useful to have the actual errors for issue 2 so we can determine if this is actually an issue we can fix.

Actions #3

Updated by lucag_73 almost 6 years ago

Sure. Here they are.

1) The error for issue 1 is:

/home/lucag/Src/EMU/dolphin/Source/Core/Common/x64CPUDetect.cpp:41:12: error: ambiguating new declaration of ‘u64 _xgetbv(u32)’
static u64 _xgetbv(u32 index)
~~~~~~
In file included from /usr/lib/gcc/x86_64-redhat-linux/8/include/x86intrin.h:74,
from /home/lucag/Src/EMU/dolphin/Source/Core/Common/Intrinsics.h:30,
from /home/lucag/Src/EMU/dolphin/Source/Core/Common/x64CPUDetect.cpp:10:
/usr/lib/gcc/x86_64-redhat-linux/8/include/xsaveintrin.h:60:1: note: old declaration ‘long long int _xgetbv(unsigned int)’
_xgetbv (unsigned int __A)
~~~~~~
/home/lucag/Src/EMU/dolphin/Source/Core/Common/x64CPUDetect.cpp:41:12: warning: ‘u64 _xgetbv(u32)’ defined but not used [-Wunused-function]
static u64 _xgetbv(u32 index)

2) As for issue 2, this is what I get:

In file included from /home/lucag/Src/EMU/dolphin/Source/Core/Common/Compat/variant:8,
from /home/lucag/Src/EMU/dolphin/Source/Core/Common/Lazy.h:9,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.h:14,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:27:
/usr/include/c++/8/variant: In instantiation of ‘void std::detail::variant::erased_assign(void*, void*) [with _Lhs = std::unique_ptrDiscIO::FileSystem&; _Rhs = const std::unique_ptrDiscIO::FileSystem&]’:
/usr/include/c++/8/variant:604:27: required from ‘std::
detail::variant::_Move_assign_base<, _Types>& std::detail::variant::_Move_assign_base<, _Types>::operator=(std::detail::variant::_Move_assign_base<, _Types>&&) [with bool = false; _Types = {std::unique_ptr >, std::function >()>}]’
/usr/include/c++/8/variant:645:12: required from ‘const Common::Lazy& Common::Lazy::operator=(std::variant >&&) [with T = std::unique_ptrDiscIO::FileSystem]’
/home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:38:3: required from here
/usr/include/c++/8/variant:254:42: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = DiscIO::FileSystem; _Dp = std::default_deleteDiscIO::FileSystem]’
__variant::
ref_cast<Lhs>(lhs) = __variant::ref_cast<_Rhs>(rhs);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/8/memory:80,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:8:
/usr/include/c++/8/bits/unique_ptr.h:395:19: note: declared here
unique_ptr& operator=(const unique_ptr&) = delete;
~~~~~~~
In file included from /home/lucag/Src/EMU/dolphin/Source/Core/Common/Compat/variant:8,
from /home/lucag/Src/EMU/dolphin/Source/Core/Common/Lazy.h:9,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.h:14,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:27:
/usr/include/c++/8/variant: In instantiation of ‘void std::
detail::variant::erased_ctor(void*, void*) [with _Lhs = std::unique_ptrDiscIO::FileSystem&; _Rhs = const std::unique_ptrDiscIO::FileSystem&]’:
/usr/include/c++/8/variant:465:30: required from ‘std::
detail::variant::_Copy_ctor_base<, _Types>::_Copy_ctor_base(const std::detail::variant::_Copy_ctor_base<, _Types>&) [with bool = false; _Types = {std::unique_ptr >, std::function >()>}]’
/usr/include/c++/8/variant:506:7: required from ‘std::
detail::variant::_Move_assign_base<, _Types>& std::detail::variant::_Move_assign_base<, _Types>::operator=(std::detail::variant::_Move_assign_base<, _Types>&&) [with bool = false; _Types = {std::unique_ptr >, std::function >()>}]’
/usr/include/c++/8/variant:645:12: required from ‘const Common::Lazy& Common::Lazy::operator=(std::variant >&&) [with T = std::unique_ptrDiscIO::FileSystem]’
/home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:38:3: required from here
/usr/include/c++/8/variant:242:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = DiscIO::FileSystem; _Dp = std::default_deleteDiscIO::FileSystem]’
::new (
lhs) _Type(variant::ref_cast<_Rhs>(_rhs));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/8/memory:80,
from /home/lucag/Src/EMU/dolphin/Source/Core/DiscIO/VolumeGC.cpp:8:
/usr/include/c++/8/bits/unique_ptr.h:394:7: note: declared here
unique_ptr(const unique_ptr&) = delete;
~~~~~~~~~
make[2]: *** [Source/Core/DiscIO/CMakeFiles/discio.dir/build.make:271: Source/Core/DiscIO/CMakeFiles/discio.dir/VolumeGC.cpp.o] Error 1

Actions #4

Updated by jkms almost 6 years ago

Same issue. Fresh install of Fedora 28. I was able to resolve item 1 as per lucag_73, but I couldn't figure out how to implement the fix for item 2.

Tried the following, but nothing worked for me (clearly I haven idea what I'm doing, but that's okay)

cmake -std=c++14 ..
CXXFLAGS+=-std=c++14 cmake ..
cmake -DCMAKE_CXX_FLAGS="-std=c++14" ..

Anyway, rolled back to Fedora 27 for the time being. Compile works perfectly there.

Actions #5

Updated by lucag_73 almost 6 years ago

I have also been unable to force c++14 from command line.
What I did was to edit CMakeLists.txt replacing the stanza
check_and_add_flag(CXX17 -std=c++17)
if(NOT FLAG_CXX_CXX17)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()

with just

check_and_add_flag(CXX17 -std=c++17)

if(NOT FLAG_CXX_CXX17)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

endif()

Actions #6

Updated by lucag_73 almost 6 years ago

ops... I meant I commented/deleted the check_and_add_flag, as well as the conditional (the comment on if/endif should not be necessary; none the less...)

Actions #7

Updated by lucag_73 almost 6 years ago

The file to edit is Source/CMakeLists.txt and the lines to delete, 21, 22 and 26

lucag_73 wrote:

ops... I meant I commented/deleted the check_and_add_flag, as well as the conditional (the comment on if/endif should not be necessary; none the less...)

Actions #8

Updated by jkms almost 6 years ago

Thanks lucag_73. that worked.

for anyone stumbling on this looking for a "tl;dr:

$ git diff
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 652b5f5422..13907fbf82 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -18,12 +18,12 @@ if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
 else()
   # Enable C++17, but fall back to C++14 if it isn't available.
   # CMAKE_CXX_STANDARD cannot be used here because we require C++14 or newer, not any standard.
-  check_and_add_flag(CXX17 -std=c++17)
-  if(NOT FLAG_CXX_CXX17)
+  #  check_and_add_flag(CXX17 -std=c++17)
+  #  if(NOT FLAG_CXX_CXX17)
     set(CMAKE_CXX_STANDARD 14)
     set(CMAKE_CXX_STANDARD_REQUIRED ON)
     set(CMAKE_CXX_EXTENSIONS OFF)
-  endif()
+  #  endif()

   # These compat headers must not be in the include path when building with MSVC,
   # because it currently does not support __has_include_next / #include_next.
diff --git a/Source/Core/Common/x64CPUDetect.cpp b/Source/Core/Common/x64CPUDetect.cpp
index 74d22b3e32..ad33a542a7 100644
--- a/Source/Core/Common/x64CPUDetect.cpp
+++ b/Source/Core/Common/x64CPUDetect.cpp
@@ -1,6 +1,7 @@
 // Copyright 2008 Dolphin Emulator Project
 // Licensed under GPLv2+
 // Refer to the license.txt file included.
+#define _XSAVEINTRIN_H_INCLUDED

 #include <cstring>
 #include <string>

Actions #9

Updated by lucag_73 almost 6 years ago

Incidentally, I have had the same problem with _xgetbv in compiling pcsx2: https://github.com/PCSX2/pcsx2/issues/2417
The "trivial" patch to use the library version of _xgetbv has shown that there is actually also an issue with the way gcc 8 treats that instruction: https://github.com/PCSX2/pcsx2/pull/

Actions #10

Updated by KAMiKAZOW almost 6 years ago

According to https://github.com/libretro/dolphin/issues/13#issuecomment-386243414 fixing the issue is weirdly easy -- it involves only adding two underscores.

Actions #11

Updated by JosJuice almost 6 years ago

The _xgetbv issue should have been fixed by 5.0-7291 (https://dolphin-emu.org/download/dev/2ab51c73c6e384b55ac8b95891bcecc455fae0da/). Are you still having the VolumeGC.cpp issue when compiling the latest version of master?

Actions #12

Updated by lucag_73 almost 6 years ago

Indeed; the issue with VolumeGC.cpp is still open when compiling with the default options (i.e. -std=c++17).

Actions #13

Updated by KAMiKAZOW almost 6 years ago

More and more Linux distributions are migrating to GCC8. Would be cool if a real bugfix could make it into Dolphin.

Actions #14

Updated by JosJuice almost 6 years ago

  • Milestone set to Current
Actions #15

Updated by Billiard26 over 5 years ago

  • Subject changed from Compilation problems in Fedora 28 to Compilation problems in Fedora 28 / GCC 8 / C++17
Actions #16

Updated by Billiard26 over 5 years ago

Actions #17

Updated by JosJuice over 5 years ago

Actions #18

Updated by JosJuice over 5 years ago

Actions #19

Updated by Billiard26 about 5 years ago

I can't reproduce this with GCC 8.2.1 so it's hard to fix the issue.
Can someone with the issue try this potential fix? https://github.com/jordan-woyak/dolphin/commit/1782cd0dcf17db57cbe8d1261732f0de6950f781

Actions #20

Updated by KAMiKAZOW about 5 years ago

All build targets seem to work: https://build.opensuse.org/package/show/home:KAMiKAZOW:Test/dolphin-emu (see the box on the right).

Actions #21

Updated by Billiard26 about 5 years ago

  • Status changed from New to Working as intended

Seems like a compiler bug that was fixed.

Actions #22

Updated by KAMiKAZOW about 5 years ago

Just to clarify: I built your branch but I can try vanilla upstream as well.

Actions #23

Updated by Billiard26 about 5 years ago

Ah. Yeah, please let me know if that works. :P

Actions #24

Updated by lucag_73 about 5 years ago

Recent versions of the emulator work flawlessly (without the workaround in the CMakefile)
Actually I have also updated the compiler to gcc version 8.2.1 20181215 (Red Hat 8.2.1-6) (GCC), so, perhaps,
some fixes have been made there as well.

Actions #25

Updated by KAMiKAZOW about 5 years ago

Vanilla Dolphin indeed builds fine under Fedora 28 now. So yeah, it was probably a GCC bug (or they've added a compatibility workaround).

Actions

Also available in: Atom PDF