LinuxにWIN32ライブラリを移植しています。ライブラリをエラーなしでコンパイルできます。しかし、リンクしようとすると、次のリンクエラーが発生します
`setmode'への未定義の参照
setmode関数は標準ライブラリ関数であり、unistd.hにあり、ターミナルを介してリンクしているときに引数-lcを指定します。
これは、setmodeについてさらに明るくしたリンクです。
同じための助けはありますか?
これらの答えはナンセンスだと思います。Win32環境からのプログラムは、2つの可能な関数のいずれかを使用しています。MSDNに記載されsetmode
ているMicrosoft_setmode
関数、またはそれを模倣したCygwinのいずれかです。setmode
これはBSDとは何の関係もありませんsetmode
。これは、ファイル記述子をバイナリまたはテキスト変換モードに設定する2つの引数の関数です。
プログラムがこの機能を期待しているが、LibBSDにリンクしている場合、プログラムはリンクしている可能性がありますが、正しくありません。
GNU Cライブラリは、ストリームまたは記述子のテキストまたはバイナリモードを操作するためのインターフェイスを提供していません。提供しているFILE *
場合、2つのモードは同一であるため、何も実行されません。
CygwinでCygwin関数を必要とするコードは、setmode
Unixで何もしないことでおそらくうまくいく可能性があります。つまり、次のようになります。
#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
私もこれに問題がありました。リンクはmakeプロセス中に発生するため、これが発生し、cを扱うビジネスがない人(私のように)はcygwinまたはmingwを使用しようとします。Cairnarvonの回答のおかげで、必要なincludeステートメントが欠落していることがわかりました。
#include <io.h>
...setmode
関数を呼び出すモジュール内(私の場合、Cygwin 64ビットでGDALを構築しようとしています)。私がこれらの人々の答えを見て、Cygwinの64ビットバージョンが32ビットバージョンのように強調を付けないことを知るまで、エラーは残りました。だから私は手動でプリペンディングを行い、makeは[もっと]正常に終了しました。これがお役に立てば幸いです。
setmode
標準ライブラリ関数ではありません。これはlibbsd関数です。これは、そのマニュアルページの元となっているOSXのようなBSD派生システムでも同じです。-lbsd
引数を渡して、リンカーがLinux上でリンカーを検索できるようにします。
インターネットを介して自分のシステムのマニュアルページを常に信頼してください。
<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