3

LinuxにWIN32ライブラリを移植しています。ライブラリをエラーなしでコンパイルできます。しかし、リンクしようとすると、次のリンクエラーが発生します

`setmode'への未定義の参照

setmode関数は標準ライブラリ関数であり、unistd.hにあり、ターミナルを介してリンクしているときに引数-lcを指定します

これは、setmodeについてさらに明るくしたリンクです。

同じための助けはありますか?

4

4 に答える 4

6

これらの答えはナンセンスだと思います。Win32環境からのプログラムは、2つの可能な関数のいずれかを使用しています。MSDNに記載されsetmodeているMicrosoft_setmode関数、またはそれを模倣したCygwinのいずれかです。setmode

これはBSDとは何の関係もありませんsetmode。これは、ファイル記述子をバイナリまたはテキスト変換モードに設定する2つの引数の関数です。

プログラムがこの機能を期待しているが、LibBSDにリンクしている場合、プログラムはリンクしている可能性がありますが、正しくありません。

GNU Cライブラリは、ストリームまたは記述子のテキストまたはバイナリモードを操作するためのインターフェイスを提供していません。提供しているFILE *場合、2つのモードは同一であるため、何も実行されません。

CygwinでCygwin関数を必要とするコードは、setmodeUnixで何もしないことでおそらくうまくいく可能性があります。つまり、次のようになります。

#ifdef __CYGWIN__
setmode(fileno(my_stdio_stream), O_BINARY);
#elif _WIN32
_setmode(_fileno(my_stdio_stream), _O_BINARY);
#else
/* nothing on systems with no text-vs-binary mode */
#endif
于 2018-05-18T21:28:12.323 に答える
4

私もこれに問題がありました。リンクはmakeプロセス中に発生するため、これが発生し、cを扱うビジネスがない人(私のように)はcygwinまたはmingwを使用しようとします。Cairnarvonの回答のおかげで、必要なincludeステートメントが欠落していることがわかりました。

#include <io.h>

...setmode関数を呼び出すモジュール内(私の場合、Cygwin 64ビットでGDALを構築しようとしています)。私がこれらの人々の答えを見て、Cygwinの64ビットバージョンが32ビットバージョンのように強調を付けないことを知るまで、エラーは残りました。だから私は手動でプリペンディングを行い、makeは[もっと]正常に終了しました。これがお役に立てば幸いです。

于 2014-11-14T20:19:19.567 に答える
3

setmode標準ライブラリ関数ではありません。これはlibbsd関数です。これは、そのマニュアルページの元となっているOSXのようなBSD派生システムでも同じです。-lbsd引数を渡して、リンカーがLinux上でリンカーを検索できるようにします。

インターネットを介して自分のシステムのマニュアルページを常に信頼してください。

于 2013-03-25T05:21:22.463 に答える
0

<bsd/unistd.h>(ではなく)ヘッダーを使用する必要があります<unistd.h>

私のUbuntuボックスでは、パッケージをインストールする必要がlibbsd0ありましたlibbsd-dev

sudo apt-get install libbsd0 libbsd-dev

その後、次のプログラムをコンパイルすることができました。

#include <bsd/unistd.h>

int main(void) {
    setmode(0);
    return 0;
}

コマンドの使用:

gcc hello.c -lbsd
于 2013-03-25T05:36:37.860 に答える