【C言語】MinGWでマルチスレッドプログラムのコンパイルができなかった話
戦車の話が一切出てこない暇人戦車長です。
今回はWindows環境でのC言語プログラム作成でこけた話です。
Windows10環境にMinGWを導入してまともなソースコードが書けている状態からスタートです。
この解決法で問題が起きても僕は一切責任を負いませんので自己責任でお願いします。
コンパイル通らん
「-lpthread」をつけてgccしたのにエラーが・・・
Makefileでは
$gcc -o ファイル名 ソースファイル名 -lpthread
的なことしてます。
エラーコードは
"fatal error: pthread.h: No such file or directory
#include <pthread.h>
^
compilation terminated.
make: *** [XX.o] Error 1"
つまり「ライブラリpthread.hが見つからん」ってことですね。
ヘッダファイル等の手動導入
ないなら手動で入れるしかないじゃないということでgithubの
にアクセスして、
・libpthread-2.8.0-3-mingw32-dll-2.tar.lzma
・pthreads-w32-2.8.0-3-mingw32-dev.tar.lzma
をDL。
$lzma -d ファイル名
を実行して二つともを解凍一回目。
できた二つのファイル↓を
WinRARとかで解凍2回目。
するとこの二つのフォルダ―ができる
この中身の「bin」「lib」「include」をフォルダごとMinGW直下↓にコピーすればOK。
それでもエラーは吐かれ続ける
「ヘッダファイル突っ込んだしコンパイル通るやろ」と思ってコンパイルしたら
$ make all gcc -c XX.c
In file included from c:\mingw\include\pthread.h:288:0,
from XX.c:5:
c:\mingw\include\sched.h:152:47: error: unknown type name 'pid_t'
PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy);
^~~~~
c:\mingw\include\sched.h:154:47: error: unknown type name 'pid_t'
PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid);
^~~~~
In file included from XX.c:5:0:
c:\mingw\include\pthread.h:307:8: error: redefinition of 'struct timespec'
struct timespec {
^~~~~~~~
In file included from c:\mingw\include\pthread.h:218:0,
from XX.c:5:
c:\mingw\include\time.h:115:8: note: originally defined here
struct timespec
^~~~~~~~
make: *** [XX.o] Error 1
エラーだよコンチクショウ!!!
エラーコードを見ると
① sched.hでのerror: unknown type name 'pid_t'
② pthread.h&time.hでのerror: redefinition of 'struct timespec'・originally defined here(競合)
の二つかなぁと見れる
インクルードガードやらを追記
①の方はtype nameを宣言?してやれば解決しそうってことで覗くと
sched.h
おろ?
宣言されてるやん。
if文で弾かれたかな???って当たりを付けて
sched.h
#endifの後(126行目)に
typedef int pid_t;
を追記。
良くはないだろうけどまぁ行けるっしょって感じで。
②は・・・
競合かなぁ
"struct timespec"っていう関数が重複して宣言されてるって感じ。
インクルードガードは???
まさか・・・
pthread.h
oh.....
time.hが先に読まれた場合の記述がない
time.hの方には
#if defined __need_struct_timespec && ! __struct_timespec_defined
がありますね。
なので、pthread.h→time.hの順に読まれてたらセーフだったのかも。
pthread.hにインクルードガードを追記しましょう
timespec関数を定義する部分を挟むように
#ifndef _TIME_H
と
#endif
を追記。
コンパイル通してみると
無事通りました。
これが正しいやり方なのかわかりませんが無事に通ってよかったです。
ホントめんどくさかった・・・。
【沼津高専寮】素晴らしきかな我らが寮(愚痴)
※「自称陽キャ」と区別される方には不快な思いをさせる文言が多数あります
一部の寮生に対し、このような大きな主語と置換する行為につきましてお許しください
いつぶりなんでしょうかねこんにちは。
暇人です。
今年度ももうあと僅かですがみなさんはいかがお過ごしですか?
自称自治寮に住んで3年が経とうとしています。
毎年、改革をするとかなんとかいてる割には(組織だし中々変わってかないのはしょうがないんでしょうけど)あまり変化が無いように感じています。
良くなってる部分もちょいちょいあります。
改悪されるよりはましですが挙がってる案は良いものが多いので通ると良いんですけどね。
寮全体の流れとして改良をしていこうとする中、人の質的には悪化し続けていて3年前のほうがよかったのではと思ってます。
風呂で奇声あげる人もいなかったし、食堂で騒ぐ人もいなかったし、豆まき(ドッグフードならまだしも納豆や生卵があるとか)も一応禁止された年だったしホントいい年でした。
現在を見ればもう動物園でどうしようもないですが、三年前はまだもうちょっとまともだったんです。
自称陽キャが他人を害すような行動を普通に行うようになってホント住みにくくなりました。
僕は静かに暮らしたいです。(下宿ってけっこうお金かかるので選択肢に上げにくいんですよね。自宅から通うのもちょい辛いし・・・ってことで寮にいたいんですが)
某栄峰では今日(2/3)豆まきが行われたようで・・・
Twitter見てるとまぁクソ活動ですよね。
私物(自室の中)に豆腐投げつけられたり
廊下には小麦粉と腐った牛乳と何かを撒いたり・・・
巻き込まれた方が変な病気に罹らなければいいんですけど。
「無病息災」を祈る行事だったと思うのですがどこにその要素があるのかわかりかねます。
豆「魔滅(まめ)」を投げるからこその行事だと思うのですが。
まぁ何も考えられない人たちなんてこんなもんなのでしょうかね。
幼稚園保育園の子のほうがまだ節度ある行動をとる気がします。
しかもテスト勉強期間(執筆時2/3・テスト2は/12から)ですからね。
何なんですかね?
はっちゃけるのはいいと思うのですがはっちゃけたい人たちで他に一切迷惑をかけずやってほしいものですね。
節分ではっちゃけるってなんなんだと思いますが
これを見てもまだ沼津高専に期待を寄せる中学生以下と企業の方は人を組織ではなく個人として見ている素晴らしい方だと思います。
自分はどうしても組織として見てしまう時があるので直していきたいです。
中学生の方にはぜひいいところ悪いところよく調べて、高専入学を考え直したり覚悟を決めたりしていただきたいです。
沼津高専の一員の自分が言うのもなんですけどね。
各行事慣習の意味を知りそれに合った行動が求められますね。
--------------------------------------------------
2020年3月11日追記
あんさん
コメントありがとうございます。
このような汚い文章を読んでくださりありがとうございます。(他の記事も読んでくださっているとのことで・・・感謝しかないです)
近頃、寮内や学内での不適切行動が増えてきていて悲しく思います。
沼津高専の組織の一員であり主役でもある学生自身が、故意に自分たちの価値を下げるような行動をとるのは、サポートしてくださる方々に対しなんともなことだと思います。(発信すると余計に知られることになりますが・・・)
自由な環境になっている意味を考えて、その自由が制限される可能性のある行動はうまく許される範囲で抑えるなり慎むなりしてほしいものです。
これからもよろしくお願いいたします。