8

WindowsでLinuxで書かれたプログラムをコンパイルしようとしています(mingwを使用しています)

void make_directory(const char* name) {
  mkdir(name1, name2);
}

エラーがあります:

Too Many Arguments to function 'int mkdir(const char*)'

これを解決するアイデアはありますか?

4

3 に答える 3

7

Linuxで書かれたプログラムをmingw-w64でビルドする場合、私はこれでうまくいきました:

#if (defined(_WIN32) || defined(__WIN32__))
#define mkdir(A, B) mkdir(A)
#endif
于 2016-05-30T08:17:28.697 に答える
6

コメントで述べたように、引数は1 つmkdir()だけ取ります。ただし、この関数は非推奨であるため、代わりに次を使用する必要があります。 _mkdir()

int _mkdir(const char *dirname); 
int _wmkdir(const wchar_t *dirname); /* for wide-character */

両方のシステム (linux / mingw) で機能が必要な場合:

void make_directory(const char* name)
{
#ifdef __linux__
    mkdir(name, 777); /* Or what parameter you need here ... */
#else
    _mkdir(name);
#endif
}

編集:

MinGW の実装:

_mkdir():

_CRTIMP int __cdecl __MINGW_NOTHROW _mkdir (const char*);

mkdir():

_CRTIMP int __cdecl __MINGW_NOTHROW mkdir (const char*);

どちらも で指定されていますが、代わりio.hに含める方が良いと思います(その部分に含まれています)。direct.hio.h

于 2013-01-07T16:14:22.270 に答える
3

name1とはどちらも、作成するディレクトリの名前であると想定しname2ます (ただし、以下を参照してください)。

mkdir()単一のディレクトリを作成 (または作成を試行) します。2 つのディレクトリを作成する場合は、mkdir()2 回呼び出す必要があります。

さらに混乱を招くのは、POSIXmkdir()関数は実際には2 つの引数を取りますが、2 番目の引数は名前ではありません。私のシステムのマニュアルページを引用する:

#include <sys/stat.h>
#include <sys/types.h>

int mkdir(const char *pathname, mode_t mode);

olloの_mkdir()回答で言及されている関数は、Microsoft Windows に固有のものであり、単一の引数を取ります。モード、つまりパーミッションは、Windows では POSIX (Unix、Linux など) システムとは異なる働きをします。

しかし、あなたのコンパイラは明らかにmkdir()引数が 1 つしかないと考えているので、なぜそう考えるのか不思議です。関数#includeの宣言を取得するためにどのヘッダーを使用しましたか?mkdir

上で述べたように、POSIXmkdir()は 2 つの引数を取りますが、2 番目はmode_tであり、名前ではありません。コードはもともと Linux 用に書かれたものだとおっしゃっています。引数は本当にname1and と呼ばれてname2いますか、または名前を変更してコードを単純化しようとしましたか? 質問を更新して、実際のコピー アンド ペーストされたコードを表示できますか?

于 2013-01-07T16:40:56.957 に答える