Я тестирую простой модуль C ++, используя модули ts:
export module strings;
#include <string>
Когда я пытаюсь скомпилировать это с заголовками clang (trunk) и GCC 7.2 в linux, я получаю следующее:
clang++ -std=c++2a -fmodules-ts -fprebuilt-module-path=. --precompile -x c++-module -o strings.pcm ../../src/base/strings.cc
In file included from ../../src/base/strings.cc:2:
In file included from /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/string:52:
In file included from /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/bits/basic_string.h:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/ext/atomicity.h:35:
In file included from /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0/bits/gthr.h:148:
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0/bits/gthr-default.h:101:1: error: weakref declaration must have internal linkage
__gthrw(pthread_once)
^
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0/bits/gthr-default.h:99:23: note: expanded from macro '__gthrw'
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name)
^
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0/bits/gthr-default.h:90:46: note: expanded from macro '__gthrw2'
static __typeof(type) name __attribute__ ((__weakref__(#name2))); \
^
Я пытался предварительно включить <bits/gthr-default.h>
(перед export module
), но тогда я получаю ошибки, касающиеся time.h
а также sched.h
…
Кто-нибудь знает способ заставить это скомпилировать?
(Полное сообщение об ошибке см. Здесь: https://godbolt.org/g/wfjmpW)
Для записи, я нашел (несколько) лучше решение:
export module strings;
#if defined(__GXX_WEAK__)
#include <bits/gthr-default.h>
#endif
#include <string>
Это работает, даже если мне нужно #include <ctime>
внутри модуля.
Других решений пока нет …