スタック・オーバーフロー Asked by nobelnambu on December 16, 2021
現在、CygwinでDUNEと呼ばれるC++ベースの偏微分方程式を解くツールのインストールを進めているのですが、ビルドしようとした所、以下のエラーが発生しました。
‘mkstemp’ was not declared in this scope
調べた所、mkstempとはLinuxのライブラリコール関数の様なのですが、Cygwinでこの関数が定義されたファイルを含むライブラリをビルドする方法ご存知の方居ましたら御教示頂け無いでしょうか?ちなみに、Cygwinのバージョンは以下の通りです。
CYGWIN_NT-10.0 A050946732 3.0.7(0.338/5/3) 2019-04-30 18:08 x86_64 Cygwin
DUNE
は c++ ベースなので fseeko
とか mkstemp
とか使ってないはずなんだけど。実際 dune-common-2.6.0.tar.gz
中には find . -exec grep -n fseeko {} ;
で何もヒットしなかったっす (他は展開してない) オイラの見ている https://www.dune-project.org/ とは違うものなのかな?
cygwin 3.0.7(0.338/5/3) で次のプログラムは通ったっす。リンク先にも #include <stdlib.h>
しろ、との説明ありますよね。
$ cat mkstest.c
#include <stdlib.h>
int main() {
char temp[]="/tmp/mkXXXXXX";
return mkstemp(temp);
}
$ gcc mkstest.c
$ ./a.exe
$ ls /tmp
mkCCxXft
$
# $ dune-common-2.6.0/bin/dunecontrol all
がまともに通らないのでそれ以上追及する気にならない
dune-grid-2.6.0/dune/grid/io/file/dgfparser/dgfparser.cc
中に HAVE_MKSTEMP
で条件分けされて mkstemp()
と std::tmpnam()
を使い分けている個所があります。
mkstemp()
をやめて std::tmpnam()
を使うc++ っぽくするならこっちだけど man tmpnam
によると
https://ja.cppreference.com/w/cpp/io/c/tmpnam
tmpnam()
はかぶらなそうなファイル名を返すだけでファイルを作るわけではないので、他人がクリティカルなタイミングで同一名称のファイルを作ることができるとのこと。こっちで対処する場合は config.h
中から #define HAVE_MKSTEMP 1
の行を手で削除すればよいです。
mkstemp()
を使うdgfparser.cc
の先頭に
#if HAVE_MKSTEMP
#include <unistd.h>
#endif
なる行がありますが、これが多分間違いで <stdlib.h>
でないといけないはず。 hpux11.11 の man mkstemp
でも <stdlib.h>
が指示されています。というわけでこれは DUNE の側のバグと言い切っちゃっていいでしょう。( DUNE 側の都合で <unistd.h>
を使っているのかもしれないが)ソースの手修正を行うことが適切だと思われます。
tmpfile()
に書き直すmkstemp()
は古いので tmpfile()
を使うよう直せと hpux11.11 は主張していますので、この際直してもよいかも。ただし tmpfile()
std::tmpfile()
が作ったファイルは自動削除されるので、恒久化の目的には使えません。
Answered by 774RR on December 16, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP