53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

来訪ありがとうございます
シストレツールを自作してました
自分用の記事が多いのであまり役には立たないブログでした

f:id:sucar:20150414193802p:plain

自作システム詳細目次

3 gcc(mingw64) のインストール

さて、msys2 は無事インストールでき、立ち上がっているが、実はまだ開発環境が入っていない

qiita.com

↑ここが詳しくてわかりやすかった

ここの

64bit 版 gcc のインストール

を参考にpacmangcc を入れてみたとこ

$pacman -S mingw-w64-x86_64-toolchain

ググればいろんな記事が出てくるので、参考にしながら、環境を整えていけばよろしいのですw

 

2 msys2 更新

msys2 の魅力は pacman を移植してありこれで簡単にパッケージを最新版に保てるのですが、バージョンによってやり方が異なるので???となる

ようやく一番わかりやすい情報にたどり着いたのでリンクを張ります

qiita.com

2016/11/3現在の最新版では

update-coreコマンドは削除されているので

$ pacman -Syuu

でいいようです

 

改めて開発日記スタート(どっちかというと自分用備忘録)1 msys2 DL 

何か迷走していますが、自分用と割り切って、株のシストレツールの開発経緯を自分用の備忘録として書いていきます

まずはMSYS2のインストール

MSYS2 installer

ここの上に2つあるけど

-i686- の方が32bit

-x86_64- の方が64bit

自分は64bitの方が使いたいので-x86_64- の方を落としました

20161025版です ただ もう一つのPCには2016の9月版が入ってます

もっともMSYS2は pacman コマンドで随時最新版に更新できるのであまり気にしなくてもいいかも

また初代のMSYSというか、これとは違うMSYSもあって

MinGW | Minimalist GNU for Windows

ここからDL可能です

現在の私のシステムはMingw+初代MSYSで動いてるんだけど、将来を考えてMSYS2環境に移行をしようかと・・・

まあその先はLinuxで動かしちゃえなんですけどw

とりあえずDLしてインストールしました(インストールはそんな迷うところはないので手順とかは省略 単に落としたexeを実行すればよいので)

もう一つのPCには既にいろいろ環境構築されているんだけど、一応備忘録のため再度手順を纏めておこうと

とりあえずこの記事でMSYS2のDLとインストール終了

あと、デスクトップにショートカットおきたい派なので

\msys64\mingw64.exeをデスクトップにショートカット作成しとく

できたショートカットをクッリクして起動したら

f:id:sucar:20161103144553p:plain

左上のMのアイコンクリックするとメニューがでるので  options -> text 

で好きなフォントを選べばよろし

とりあえずここまで

 

kona linux でswapがマウントされていなかった件(UUID編

一つ前の記事が少し中途半端だったので、続編

abenomix.hatenablog.com

要は「インストール後swapがマウントされてなかったら自分で設定してね」ということで

# mkswap /dev/sda4 または $ sudo mkswap /dev/sda4

(/dev/sda4 はswapにしたいパーテーション)でswapを作り

/etc/fstab を編集して

/dev/sda4 swap swap defaults 0 0

と書いとけばいいよ ってことです

ただ、現在は/dev/xxxx ではなく UUID=xxxxxx で記述するのが推奨されているらしい

で、UUIDの調べ方ですが、

# blkid  または $ sudo blkid

で表示されるのでそれを使えばOK

で(私の環境の場合)は

UUID=a4c9b36e-ce37-4c02-96ce-5e948dd77477 none swap sw 0 0

と書いたらOKだった

実はそもそもインストール直後の/etc/fstabがなぜか

UUID=swap none swap sw 0 0

ってなってて????

本来UUIDが書かれる部分がswapと書かれたのがマウントされない原因だったと・・・

などと偉そうに書いてますが、正直なところUUIDって何??? とググって勉強になったというわけです

ただひとつわからないことがあって

UUIDを使わない書式だと

/dev/sda4 swap swap defaults 0 0

UUIDを使う書式だと

UUID=a4c9b36e-ce37-4c02-96ce-5e948dd77477 none swap sw 0 0

と赤字の部分が異なるのだが????

この辺がよくわからないのですが、とりあえず、現在推奨のUUID記述を見様見真似でマスターしました ということで・・・

 

kona linux でswapがマウントされていなかった件

kona linux 3.0 light をインストールしたのですが、インストール時にswapパーテーションを作ったはずなのにマウントされていないことが判明

kazmax.zpp.jp

↑ここを参考に手動でマウント

f:id:sucar:20161012211957p:plain

/dev/sda4 がswap パーテーションなので、

suでrootになって

# mkswap /dev/sda4
# swapon /dev/sda4

で、手動でswapをマウントできた

あとは、/etc/fstab を編集すればいいはず

/dev/sda4 swap swap defaults 0 0

と記述してうまくいった

しかし、UUIDって何? 状態w

いろいろググってなんとなくわかってUUIDでも無事設定できた

UUIDは

# blkid

で調べられる

linuxインストールするの10年以上ぶりだけど、いろいろ進化してるのね?

 

TckTkのmingwでのビルドがエラーになる件

前にTclTk8.6.6をmingwでビルドした記事を書いた 

abenomix.hatenablog.com

確かにビルドできたしきちんと動いている

ところが別のPCでビルドしたらこけてしまった

違いとしては

  • ビルドできた環境  gcc 4.8.1
  • ビルドできなかった環境  gcc 5.3.0

ちなみに会社のPCのmingwgcc 4.9.3 でこれもビルドがこけた

本当にgcc のバージョンだけが原因かどうかは不明だが、些細な?環境の違いでビルドできたりできなかったりするのは確かです

mingwを今DLしてセットアップすると、gcc 4.8.1にならないので今後のことを考えるとちょっと困った事態になった感じ

ちなみにgcc5.3.0になっちゃったのは mingw-get upgrade を実行したらgccもupgradeされたということです

D:/MinGW32/msys/1.0/home/scr/tcl8.6.6/generic/tclInt.h:115:38: error: 'uintptr_t' undeclared (first use in this function)
# define PTR2UINT(p)((unsigned int)(uintptr_t)(p))
というエラーで

'uintptr_t'なんて知らん 宣言しろボケ

ってgcc様がのたまう

しかし、win/configureは

checking for uintptr_t... yes

って言っている

uintptr_t についてまったくわからなかったがいろいろググってなんとなく理解はできた

32bit 環境と64bit 環境でアドレス幅が違うからその違いを吸収するためにあるらしい

非常に困ったが自力で何とかしてみたので以下参照

 

<解決法1> uintptr_t を消すw

非常に強引だけど、よくわからないながら、uintptr_t さえなければいいのでw

エラーで落ちたとこは

# define UINT2PTR(p) ((void *)(uintptr_t)(p))
# define PTR2UINT(p) ((unsigned int)(uintptr_t)(p))
となっていて2重にキャストしている

なので強引に

# define UINT2PTR(p) ((void *)(p))
# define PTR2UINT(p) ((unsigned int)(p))
としてみるw

結論からいうとこれでビルドは成功し、動作もOKだった

ただ、あまりに強引すぎるので、確認のため

test.c

#include <stdio.h>
#include <stdint.h>

void main(void) {
  printf("%d%d%d\n",sizeof(void*),sizeof(unsigned int),sizeof(uintptr_t));
}

テストプログラムを作って実行してみると

$ gcc test
$ a
444

と全部4(つまり32bit)となるので、一応問題はなさそうである

 

<解決2>

しかし、解決1は気持ち悪いのでちゃんとした解決法がないかいろいろ考えてみたんですが・・・

仮に自作ソースでundeclaredと言われたら原因として何を考えるか?

というと

ヘッダを#includeするのを、つまり #include <stdint.h> 忘れてました

 となるのでまさかと思い調べてみると

tclInt.hの頭に

#include <stdint.h> 

がないことが判明!

半信半疑で

#include <stdio.h>の次の行に

#include <stdint.h>を追加してみると・・・

無事にビルドできました

これはバグなんだろうか?

でも、それではなぜ gcc4.8.1ではビルドできたのだろうか?

なぞは深まるが解決したからまあいいかw