macOS mojaveでgnu g++でコンパイルできない
結論
次のコマンドを実行して/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++のソースコードを用意します。
#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