CおよびC++で64ビットgccを使って32ビットプログラムをコンパイルする方法
現在、多くのLinuxディストリビューションに付属するgccコンパイラは、デフォルトで64ビット版として提供されています。しかし開発の現場では、32ビット環境向けにコードをコンパイル・実行しなければならないケースも少なくありません。そのような場合に役立つのが、gccの「-m32」オプションです。
gccのターゲットアーキテクチャを確認する
まず、現在使用しているgccコンパイラのターゲット環境を確認しましょう。ターミナルで以下のコマンドを実行します。
gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu ........... ........... ...........
出力結果の「Target」欄に「x86_64」と表示されていることから、この環境では64ビット版のgccが使用されていることがわかります。
-m32オプションで32ビット向けにコンパイルする
32ビットシステム向けにコンパイルするには、以下のように「-m32」オプションを付けてコマンドを実行します。
gcc -m32 プログラム名.c
エラーが発生した場合の対処法
このコマンドを実行すると、まれに次のようなエラーが出力されることがあります。これは、32ビットコンパイルに必要なgccの標準ライブラリ(multilib)がインストールされていないことを示しています。
In file included from test_c.c:1:0: /usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory #include <bits/libc-header-start.h> ^~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated.
このようなエラーが表示された場合は、以下のコマンドで必要なライブラリをインストールしてください。
sudo apt-get install gcc-multilib sudo apt-get install g++-multilib
32ビットと64ビットの実行結果の違いを確認する
それでは、実際にコードを実行して、32ビット環境と64ビット環境での動作の違いを見てみましょう。ここでは、long型のサイズを出力するシンプルなプログラムを使用します。
サンプルコード
#include<stdio.h>
main(){
printf("The Size is: %lu\n", sizeof(long));
}
64ビット環境での実行結果
$ gcc test_c.c
test_c.c:3:1: warning: return type defaults to 'int' [-Wimplicit-int]
main(){
^~~~
$ ./a.out
The Size is: 8
32ビット環境での実行結果
$ gcc -m32 test_c.c
test_c.c:3:1: warning: return type defaults to 'int' [-Wimplicit-int]
main(){
^~~~
test_c.c: In function 'main':
test_c.c:4:28: warning: format '%lu' expects argument of type 'long unsigned
int', but argument 2 has type 'unsigned int' [-Wformat=]
printf("The Size is: %lu\n", sizeof(long));
~~^
%u
$ ./a.out
The Size is: 4
このように、同一のソースコードでも、64ビット環境ではlong型のサイズが8バイトになるのに対し、32ビット環境では4バイトになります。これはデータ型モデル(LP64とILP32)の違いによるもので、可搬性(ポータビリティ)を意識したプログラムを作成する際には非常に重要なポイントです。なお、サンプルコードでは戻り値の型やフォーマット指定子に関する警告が表示されていますが、本題であるデータサイズの違いの確認には影響ありません。実運用のコードでは、int main(void) のように明示的に型を宣言し、%zu を使うなどして警告を回避することをおすすめします。
-
C++プログラムから外部アプリケーション(メモ帳など)を起動する方法
この記事では、C++プログラムを使ってメモ帳(Notepad)などのサードパーティ製アプリケーションを起動する方法を解説します。実装は非常にシンプルで、コマンドプロンプトで使うコマンドをそのままC++から呼び出すだけで実現できます。ポイントとなるのは、標準ライブラリの system() 関数です。この関数の引数にアプリケーション名(コマンド)を文字列として渡すと、OSがそのコマンドを実行し、対応するアプリケーションが起動します。サンプルコード#include <iostream> using namespace std; int main() { cout <<
-
C++で組み合わせと順列を計算する方法をわかりやすく解説
組み合わせと順列とは組み合わせ(Combination)と順列(Permutation)は、数学の一分野である組合せ論(Combinatorics)に属する概念です。順列とは、n個の要素の中から、1つずつ・いくつかずつ・あるいはすべてを一度に取り出して並べるときの、異なる並び方の総数のことです。並べる順序が結果に影響する点が特徴です。一方、組み合わせとは、同じくn個の要素から1つずつ・いくつかずつ・すべてを取り出して選ぶときの、異なる選び方の総数です。順序は考慮されないため、順列よりも数が少なくなります。計算式順列の数n個の要素全体からr個の要素を並べるときの順列の数は、次の公式で求められます