現在、Cygwinで[DUNE](https://www.dune-
project.org/)と呼ばれるC++ベースの偏微分方程式を解くツールのインストールを進めているのですが、ビルドしようとした所、以下のエラーが発生しました。

```

    ‘mkstemp’ was not declared in this scope
    
```

調べた所、[mkstemp](https://kazmax.zpp.jp/cmd/m/mkstemp.3.html)とはLinuxのライブラリコール関数の様なのですが、Cygwinでこの関数が定義されたファイルを含むライブラリをビルドする方法ご存知の方居ましたら御教示頂け無いでしょうか？ちなみに、Cygwinのバージョンは以下の通りです。

```

    CYGWIN_NT-10.0 A050946732 3.0.7(0.338/5/3) 2019-04-30 18:08 x86_64 Cygwin
    
```
CC BY-SA 4.0
2019-12-16T10:09:54.290
61481
2020-07-23T17:01:15.157
2019-12-16T11:17:22.497
19869
19869
question
c++ cygwin
Cygwinで‘mkstemp’ was not declared in this scopeというエラー
`DUNE` は [c++](/questions/tagged/c%2b%2b "'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()` を使い分けている個所があります。

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

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

  2. `mkstemp()` を使う

`dgfparser.cc` の先頭に

```

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

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

  3. `tmpfile()` に書き直す

`mkstemp()` は古いので `tmpfile()` を使うよう直せと hpux11.11 は主張していますので、この際直してもよいかも。ただし
`tmpfile()` `std::tmpfile()` が作ったファイルは自動削除されるので、恒久化の目的には使えません。
CC BY-SA 4.0
2019-12-16T10:46:56.323
61482
2019-12-17T03:57:46.243
2019-12-17T03:57:46.243
8589
8589
61481
answer