glibcをワイド文字=2バイト指定でmake

このQ&Aのポイント
  • glibcを使い、ワイド文字=4バイトのLinux環境下で、ワイド文字=2バイトとしてwchar系ライブラリ関数が使えるようコンパイルする方法を教えてください。
  • Linuxとcygwinで、それぞれワイド文字が4バイトと2バイトで違いがあるため、環境を切り替える方法を知りたいです。
  • Unicodeが1文字2バイト固定で長い文字列を含むデータを作成する状況で、UCS-2として直接データを扱いたいと考えています。glibcをワイド文字=2バイト指定でmakeする方法を教えてください。
回答を見る
  • ベストアンサー

glibcをワイド文字=2バイト指定でmake

glibcでワイド文字のバイト数を恣意的に変更してmakeするときの方法を ご存知の方がいましたら教えてください。 glibcを使い、ワイド文字=4バイトのLinux環境下で、ワイド文字=2バイトとして wchar系ライブラリ関数が使えるようコンパイルしたいと思っています。 makeするときに何かしら指定するオプションがあったりするのでしょうか。 それともソースの一部を触ってコンパイルしないといけないでしょうか。 同じソースから出来てると思われるLinuxとcygwinで、それぞれワイド文字が 4バイトと2バイトと違う形で環境が作られてるので、何かしら切り替える 方法があると思うのですが... makefile、configure系ファイルをざっと見てみましたが、それっぽい指定が できそうなキーワードを検索で見つけられませんでした。 なんでそんな事を考えているかというと、当Linux環境下で動くアプリが Unicodeは1文字2バイト固定で、長い文字列を含むデータを作成するのです。 そのような状況で、iconvなどを使って一度全文字UCS-4に変えてから wcs系関数を使うと、無駄が多いと思い、できればUCS-2として直接 データを扱えるようにしたいと思ったのです。 (競合対策のため、性能を第一優先としたい)

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

一応、gccに-fshort-wcharオプションを指定してコンパイルすればwchar_t型をunsigned short intと同じサイズになりますが、それだけでまともに動くかどうかは十分な検証が必要です。 > 同じソースから出来てると思われるLinuxとcygwinで、それぞれワイド文字が > 4バイトと2バイトと違う形で環境が作られてるので、何かしら切り替える > 方法があると思うのですが... GCC自体のソースは共通ですが、Cygwinの標準ライブラリはnewlibですのでglibcと同じではありません。 > そのような状況で、iconvなどを使って一度全文字UCS-4に変えてから > wcs系関数を使うと、無駄が多いと思い、できればUCS-2として直接 > データを扱えるようにしたいと思ったのです。 wcs系の関数程度なら自作してもしれています。 (C++11やC11ならchar16_tで統一してもよいですが、そこまでしなくてもよいでしょう) ちょっと面倒なのはwcscollとwcsxfrmぐらいですが、これらを使う機会はそう多くないはずです。

stosh666
質問者

お礼

おススメしてくれた通り、wcs系関数に代替する関数を一式作りました。ありがとうございます。 コーディングはラクだったのですが、こういうライブラリ系関数は、テストにとても苦労しますね。 ライブラリは汎用性が高い分、テストケースも膨れ上がるという。 返事がとても遅くなりすみません。しばらくログインできない状態になって... あのアカウント確認時のキャプチャ、画像が2つ出るけど、どうやって画像中の文字を記述したらよいのかわかりませんよね。w

関連するQ&A

  • glibc2.4がmakeできない

    OSはUbuntu14.04でapt-getのUPDATEなどはしていません。glibcは書籍「自分で作るLinux OS」から取得したものです。INTERNET環境がアナログ電話回線なのでINTERNETからDOWNLOADするというのは現実的ではありません。 はじめはbinutilsのVERSION違いでERRORだったので、 ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; 2.2[0-9]*) を追加しました。 その後makeすると以下のようなERRORが出てglibc2.4がmakeできません。どのようにすればこのERRORを解決することが出来るでしょうか。初心者ですが、よろしくおねがいします。字数制限の関係上、ERROR内容を省略したので、解決に必要な部分があったら補足します。 $ sudo make make -r PARALLELMFLAGS="" CVSOPTS="" -C ../glibc-2.4 objdir=`pwd` all make[1]: ディレクトリ `/usr/local/source/glibc-2.4' に入ります ---中略--- mv -f /usr/local/source/build-glibc/sysd-rulesT /usr/local/source/build-glibc/sysd-rules mawk -f scripts/gen-sorted.awk \ -v subdirs='csu assert ctype locale intl catgets math setjmp signal stdlib stdio-common libio malloc string wcsmbs time dirent grp pwd posix io termios resource misc socket sysvipc gmon gnulib iconv iconvdata wctype manual shadow po argp crypt nss localedata timezone rt conform debug dlfcn elf' \ -v srcpfx='' \ nptl/sysdeps/pthread/Subdirs sysdeps/unix/inet/Subdirs sysdeps/unix/Subdirs assert/Depend intl/Depend catgets/Depend stdlib/Depend stdio-common/Depend libio/Depend malloc/Depend string/Depend wcsmbs/Depend time/Depend posix/Depend iconvdata/Depend nss/Depend localedata/Depend rt/Depend debug/Depend > /usr/local/source/build-glibc/sysd-sorted-tmp mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [) /[^ mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ] mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ... make[1]: ディレクトリ `/usr/local/source/glibc-2.4' から出ます make[1]: ディレクトリ `/usr/local/source/glibc-2.4' に入ります mawk -f scripts/gen-sorted.awk \ -v subdirs='csu assert ctype locale intl catgets math setjmp signal stdlib stdio-common libio malloc string wcsmbs time dirent grp pwd posix io termios resource misc socket sysvipc gmon gnulib iconv iconvdata wctype manual shadow po argp crypt nss localedata timezone rt conform debug dlfcn elf' \ -v srcpfx='' \ nptl/sysdeps/pthread/Subdirs sysdeps/unix/inet/Subdirs sysdeps/unix/Subdirs assert/Depend intl/Depend catgets/Depend stdlib/Depend stdio-common/Depend libio/Depend malloc/Depend string/Depend wcsmbs/Depend time/Depend posix/Depend iconvdata/Depend nss/Depend localedata/Depend rt/Depend debug/Depend > /usr/local/source/build-glibc/sysd-sorted-tmp mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [) /[^ mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ] mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ... make[1]: *** `/usr/local/source/build-glibc/abi-versions.h' に必要なターゲット `/usr/local/source/build-glibc/Versions.all' を make するルールがありません. 中止. make[1]: ディレクトリ `/usr/local/source/glibc-2.4' から出ます make: *** [all] エラー 2

  • ワイド文字のバイト数が取得できず困っています。

    ワイド文字のバイト数を求めたいのですが、文字数しか取得することが出来ません。 ワイド文字のバイト数を取得する事は出来ないのでしょうか? Visual C++ 2008 Express Edhition の デバックモードで動かしています。 ****************************** wchar_t s[256]; s = L"abcあいう"; int len = wcslen(s); ******************************

  • ワイド文字(列)について

    ワイド文字(列)について質問です。 printf()などより、wprintf()などのワイド文字を扱える関数を 使おうと思っているのですが、うまく表示されません。 何が原因なのでしょうか? ソースです。 #include <stdio.h> int main(void) { wchar_t *data = L"かきくけこ"; wprintf(L"あいうえお\n"); wprintf(L"%s\n", data); return (0); } wprintf(L"%s\n", data);は表示はされるのですが、 「?」になります。 環境 XP Visual Studio 2005

  • CentOS 5にglibc-profileをインストールしたのですが・・・

    現在LinuxでCのプログラミングを勉強中です。環境はCentOS5です。 書籍を読みながら勉強しているところ、処理のスピードを解析するglibc-profileというものが出てきました。 ただしyumではこれのインストールパッケージは存在せず、 ためしにネット上からglibc-profile-2.3.6-3.i386.rpmをダウンロードしてインストール、その後、以下のオプションでコンパイルした実行ファイルが実行時に失敗します。 「cc -Wall -g -pg <ソース> -o <実行ファイル名> -lc_p」 #具体的には浮動小数点演算不正のようなメッセージが出て #エラーとなります。 #-lc_pオプションをつけなければ正常に動作するプログラムです。 教えていただきたいことは以下です。 (1)glibc-profile-2.3.6-3.i386.rpmはCentOS5にインストールして妥当なものなのか (2)-pl_cオプションを使用してエラーとなるのはglibc-profileのバージョンが原因なのか、それともコンパイル方法やソースがまずいのか (ソースコード自体も返信いただければお見せます。) (3)glibcのソースコードからのライブラリ再構築の方法について (正直rpmによるインストールしか行ったことがないのでライブラリに影響がないか不安な状態です) 以上、上記のような不具合を経験された方、また知識のある方ご教授お願いいたします。

  • 文字のバイト数を数えるには

    なんか一日一問になってしまったのですが、、 よろしくお願いします。 wchar_t 型に入っている文字のバイト数を数えるにはどうしたら良いでしょうか? L"あいう123" のような文字の場合UNICODEの場合12バイトですが、 全角半角区別して9バイトを求めたいです。 UNICODE環境では不可能でしょうか?

  • cprintf()関数で2バイト文字を表示するには

    cprintf()関数の引数に2バイト文字を含む文字列を指定してプログラムを 実行すると、表示結果の2バイト文字の部分が全て文字化けしてしまいます。 cprintf()関数で2バイト文字を表示することはできないのでしょうか? ご教示宜しくお願い致します。 下記は実際に文字化けしてしまうコードです。 ---------------------- #include <conio.h> int main(void) { cprintf("日本語 English"); return 0; } ---------------------- 【環境情報】 使用コンパイラ:VC++2008 実行環境:WinXPSP2とVistaHomePremiumSP1の2環境で確認 【質問の背景】 『独習C 第3版』という本の中に、一部のコンパイラでは、getche()の ような非標準の入出力関数とprintf()などの標準の入出力関数を併用 すると問題が発生すると記載されており、printf()関数の代わりに cprintf()関数を使用したサンプルコード(上記のコードとは異なる)も記載されています。 しかし、実際にそれをコンパイルして実行してみると、2バイト文字が 全て文字化けして表示されてしまいました。

  • visual studio2010 文字コード

    visual studio2010を使っています。Cのプログラムを書いてます。 文字セットを選ぶ箇所で ・マルチバイト文字セットを使用する ・Unicode文字セットを使用する という2つの選択肢がありますが、 上を選ぶとshift-jisの文字コードが選ばれると認識してます。 それで、下のUnicode文字セットを使用するを選んだ場合なんですが、 これはutf-16のことですか? utf-8が主流だと思っていたのでここでさすUnicodeが勝手に utf-8のことだと思ってたんですが、 visual studioで扱っている方はワイド文字で、 utf-8について調べたらASCIIにも対応できる可変長のマルチバイト という風に書いてあったので、あれ?と思い色々調べたら ウィンドウズではメモ帳などでUnicodeという表記でutf-16を指すみたいなので これも同じでutf-16なのかなと思いました。 ただ、visual studioで扱うUnicodeはワイド文字ということと、 utf-16は2バイト固定ではなく2バイト単位なだけで 4バイトで1文字を表すこともあることが書いてあったので、 これはワイド文字とは違う??と混乱してます。 それともワイド文字は2バイト固定と思ってたんですが wchar_tが2バイトずつなだけでワイド文字は1文字2バイトというわけではない ということでしょうか? それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? まとまりのない質問になってしまいましたがよろしくおねがいします。

  • make world ができない

    xenをソースからコンパイルしようとしているのですが、 make worldというコマンドを実行すればよいとあるのですが、 そもそもmake world というコマンドが叩けません。 helpをみてもありませんし、どうしたらよいのかわかりません。 環境は、CentOS5.2でインストール時に開発環境とベースのみにチェックを入れてインストールしたものになります。 どうかよろしくお願いします。

  • 文字コード変換プログラムについて

    c言語でfgetcでファイルを読み込みをiconv関数を使用して文字コードを変換したいのですが、サンプルソースを知っている方、もしくはソース知っている方教えていただけますか?

  • 自作LinuxへのGNOMEインストール方法

    こんにちは、Linux初心者の者です・・・。 私はある書籍を参考にしてUSBメモリから起動するオリジナルLinuxを製作しています。 開発環境はFedora Core 5で、glibc、busybox、module-init-tool、Linuxカーネルを導入し、現在USBメモリからログイン画面やX Window Systemの起動ができるようになりました。 そして次にGNOME 2.14をインストールしたいと思い、GNOME公式サイトからGNOME関連ソースをダウンロードし、コンパイルをしようと思っているのですが、このページ (http://www.gnome.org/start/2.14/notes/ja/rninstallation.html) に書いてあるとおりにコンパイルしてインストールすれば本当にGNOMEは立ち上がるのでしょうか? またコンパイル方法は./configure --prefix=[USBメモリのLinuxディレクトリ]→make→make installの順にやればよいのでしょうか? よろしくお願いします。