🔥

macOS mojaveでgnu g++でコンパイルできない

2021/02/04に公開

結論

次のコマンドを実行して/usr/includeにヘッダーファイルを展開します。

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

環境

  • macOS Mojave 10.14.6
  • Xcode 11.3.1
  • gnue gcc 10.2.0_3

背景

simstirngをmacOS上で使用したいのですが、Apple clangでコンパイルするとUTF-16/32のサポートが無効化されます。代わりにgnu g++でコンパイルしたいです。

問題

問題をわかりやすくするために、次のような、ヘッダーファイルをインクルードするだけの、c++のソースコードを用意します。

string.cpp
#include <string>
int main () {}

macOSデフォルトのc++コンパイラでコンパイルできることを確認します。

c++ string.cpp

このコンパイラの実体ははApple clangです。

~ c++ --version
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Homebrewを使ってgnu g++をインストールします。

brew install gcc

/usr/local/Cellar/gcc/10.2.0_3にインストールされます。
バージョンによってディレクトリが変わることに注意してください。

g++を使って、string.cppをコンパイルすると次のエラーがおきます。

~ /usr/local/Cellar/gcc/10.2.0_3/bin/c++-10 string.cpp
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/wchar.h:90,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/cwchar:44,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/bits/postypes.h:40,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/bits/char_traits.h:40,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/string:40,
                 from string.cpp:1:
/usr/local/Cellar/gcc/10.2.0_3/lib/gcc/10/gcc/x86_64-apple-darwin18/10.2.0/include-fixed/stdio.h:219:10: fatal error: _ctermid.h: No such file or directory
  219 | #include <_ctermid.h>
      |          ^~~~~~~~~~~~
compilation terminated.

解決策

macos - Can't compile C program on a Mac after upgrade to Mojave - Stack Overflowを参考にします。解決済みになっていないので、スルーしそうですが(実際、一度スルーしました)、内容を読むと解決済みです。どうやら、MojaveのいくつかのバージョンにOSアップグレードすると、/usr/includeディレクトリがなくなるようです。

自分のマシンの状態を確認すると、次のように/usr/includeがないので、該当していそうです。

~ ls /usr/include
ls: /usr/include: No such file or directory

まずGUIで、xcodeを起動して、ソフトウェアのインストールを済ませます。
(やらなくてもいいのかもしれませんが、やってしまったので検証できなくなりました。)

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

を実行すると/usr/include/ができました。

~ ls /usr/include
AppleTextureEncoder.h   grp.h                   ranlib.h
AssertMacros.h          gssapi/                 readline/
Availability.h          gssapi.h                readpassphrase.h
AvailabilityInternal.h  hfs/                    regex.h
AvailabilityMacros.h    histedit.h              removefile.h
Block.h                 i386/                   resolv.h
CommonCrypto/           iconv.h                 rpc/
ConditionalMacros.h     ifaddrs.h               rpcsvc/
Darwin.apinotes         inttypes.h              rune.h
MacTypes.h              iso646.h                runetype.h
NSSystemDirectories.h   kern/                   sandbox.h
TargetConditionals.h    krb5/                   sasl/
Xplugin.h               krb5.h                  sched.h@
__cxxabi_config.h       langinfo.h              search.h
__wctype.h              launch.h                secure/
_ctype.h                lber.h                  security/
_locale.h               lber_types.h            semaphore.h
_regex.h                ldap.h                  servers/
_stdio.h                ldap_cdefs.h            setjmp.h
_types/                 ldap_features.h         sgtty.h
_types.h                ldap_schema.h           signal.h
_wctype.h               ldap_utf8.h             simd/
_xlocale.h              ldif.h                  slapi-plugin.h
aio.h                   libc.h                  spawn.h
aliasdb.h               libcharset.h            sqlite3.h
alloca.h                libexslt/               sqlite3ext.h
apache2/                libgen.h                stab.h
apr-1/                  libkern/                standards.h
ar.h                    libproc.h               stddef.h
architecture/           libunwind.h             stdint.h
arpa/                   libxml2/                stdio.h
asl.h                   libxslt/                stdlib.h
assert.h                limits.h                strhash.h
atm/                    localcharset.h          string.h
bank/                   locale.h                stringlist.h
bitstring.h             mach/                   strings.h
bootparams.h            mach-o/                 struct.h
bootstrap.h             mach_debug/             sys/
bsm/                    machine/                sysdir.h
bzlib.h                 malloc/                 sysexits.h
cache.h                 math.h                  syslog.h
cache_callbacks.h       membership.h            tar.h
checkint.h              memory.h                tcl.h@
com_err.h               menu.h                  tclDecls.h@
complex.h               miscfs/                 tclPlatDecls.h@
compression.h           module.modulemap        tclTomMath.h@
copyfile.h              monetary.h              tclTomMathDecls.h@
corpses/                monitor.h               term.h
cpio.h                  mpool.h                 term_entry.h
crt_externs.h           nameser.h               termcap.h
ctype.h                 nc_tparm.h              termios.h
cups/                   ncurses.h@              tgmath.h
curl/                   ncurses_dll.h           tic.h
curses.h                ndbm.h                  tidy/
cxxabi.h                net/                    time.h
db.h                    net-snmp/               timeconv.h
default_pager/          netdb.h                 tk.h@
device/                 netinet/                tkDecls.h@
dirent.h                netinet6/               tkIntXlibDecls.h@
disktab.h               netkey/                 tkMacOSX.h@
dispatch/               nfs/                    tkPlatDecls.h@
dlfcn.h                 nl_types.h              ttyent.h
dns.h                   nlist.h                 tzfile.h
dns_sd.h                notify.h                ucontext.h
dns_util.h              notify_keys.h           ulimit.h
dtrace.h                ntsid.h                 unctrl.h
editline/               objc/                   unistd.h
err.h                   odmodule/               unwind.h
errno.h                 os/                     util.h
eti.h                   panel.h                 utime.h
execinfo.h              paths.h                 utmp.h
expat.h                 pcap/                   utmpx.h
expat_external.h        pcap-bpf.h              uuid/
fcntl.h                 pcap-namedb.h           vfs/
fenv.h                  pcap.h                  vis.h
ffi/                    pexpert/                voucher/
float.h                 php/                    vproc.h
fmtmsg.h                poll.h                  wchar.h
fnmatch.h               printerdb.h             wctype.h
form.h                  printf.h                wordexp.h
fsproperties.h          profile.h               xar/
fstab.h                 protocols/              xattr_flags.h
fts.h                   pthread/                xlocale/
ftw.h                   pthread.h@              xlocale.h
get_compat.h            pthread_impl.h@         xpc/
gethostuuid.h           pthread_spis.h@         zconf.h
getopt.h                pwd.h                   zlib.h
glob.h                  python2.7@

再度コンパイルしてみます。変わらずエラーが起きます。

~ /usr/local/Cellar/gcc/10.2.0_3/bin/c++-10 string.cpp
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/wchar.h:90,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/cwchar:44,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/bits/postypes.h:40,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/bits/char_traits.h:40,
                 from /usr/local/Cellar/gcc/10.2.0_3/include/c++/10.2.0/string:40,
                 from string.cpp:one:
/usr/local/Cellar/gcc/10.2.0_3/lib/gcc/10/gcc/x86_64-apple-darwin18/10.2.0/include-fixed/stdio.h:219:10: fatal error: _ctermid.h: No such file or directory
  219 | #include <_ctermid.h>
      |          ^~~~~~~~~~~~
compilation terminated.

-Iオプションで/usr/includeを指定してコンパイルします。

/usr/local/Cellar/gcc/10.2.0_3/bin/c++-10 -I/usr/include string.cpp

成功しました!

Discussion