TransWikia.com

Cygwinで‘mkstemp’ was not declared in this scopeというエラー

スタック・オーバーフロー 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

One Answer

DUNE ベースなので 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() を使い分けている個所があります。

  1. mkstemp() をやめて std::tmpnam() を使う

っぽくするならこっちだけど man tmpnam によると
https://ja.cppreference.com/w/cpp/io/c/tmpnam
tmpnam() はかぶらなそうなファイル名を返すだけでファイルを作るわけではないので、他人がクリティカルなタイミングで同一名称のファイルを作ることができるとのこと。こっちで対処する場合は config.h 中から #define HAVE_MKSTEMP 1 の行を手で削除すればよいです。

  1. mkstemp() を使う

dgfparser.cc の先頭に

#if HAVE_MKSTEMP
#include <unistd.h>
#endif

なる行がありますが、これが多分間違いで <stdlib.h> でないといけないはず。 hpux11.11 の man mkstemp でも <stdlib.h> が指示されています。というわけでこれは DUNE の側のバグと言い切っちゃっていいでしょう。( DUNE 側の都合で <unistd.h> を使っているのかもしれないが)ソースの手修正を行うことが適切だと思われます。

  1. tmpfile() に書き直す

mkstemp() は古いので tmpfile() を使うよう直せと hpux11.11 は主張していますので、この際直してもよいかも。ただし tmpfile() std::tmpfile() が作ったファイルは自動削除されるので、恒久化の目的には使えません。

Answered by 774RR on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP