次のCプログラムを 32 ビットおよび 64 ビット システム用にコンパイルしたいと考えています。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
int main(int argc, char** argv) {
size_t size = atoi(argv[1]);
int *array;
array = malloc(size * sizeof(int));
if (array == NULL) {
fprintf(stderr, "could not allocate memory\n");
exit(1);
}
fprintf(stdout, "memory allocated on heap: %u bytes\n", sizeof(int)*size);
fprintf(stdout, "press Return to quit\n");
getchar();
fprintf(stdout, "freeing memory\n");
free(array);
exit(0);
}
私が自分で行ってきたことは、Makefile
パスイン-m32
し-64
てビット固有のバイナリを作成することです:
CFLAGS=-ansi -pedantic -Wall -O3
32BIT_ARCH=-m32
64BIT_ARCH=-m64
32_CFLAGS=${32BIT_ARCH} ${CFLAGS}
64_CFLAGS=${64BIT_ARCH} ${CFLAGS}
CC=gcc
ARRAY_32BIT_BINARY_NAME=arrayTest32
ARRAY_64BIT_BINARY_NAME=arrayTest64
all: ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME}
arrayTest32: main32_array.o
${CC} ${32_CFLAGS} main32_array.o -o ${ARRAY_32BIT_BINARY_NAME}
arrayTest64: main64_array.o
${CC} ${64_CFLAGS} main64_array.o -o ${ARRAY_64BIT_BINARY_NAME}
main32_array.o: main.c
${CC} ${32_CFLAGS} -c main.c -o main32_array.o
main64_array.o: main.c
${CC} ${64_CFLAGS} -c main.c -o main64_array.o
clean:
-rm *.o *~ ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME}
install:
cp ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME} ../bin
これはうまく機能しますが、コンパイル時に警告が表示されます。
$ make
gcc -m32 -ansi -pedantic -Wall -O3 -c main.c -o main32_array.o
gcc -m32 -ansi -pedantic -Wall -O3 main32_array.o -o arrayTest32
gcc -m64 -ansi -pedantic -Wall -O3 -c main.c -o main64_array.o
main.c: In function ‘main’:
main.c:14: warning: format ‘%u’ expects type ‘unsigned int’, but argument 3 has type ‘long unsigned int’
gcc -m64 -ansi -pedantic -Wall -O3 main64_array.o -o arrayTest64
私がやりたいことは、2 つの「ビット」ターゲットに対して 2 つの main.c ファイルを持たずにこの警告を修正することです。
この違いを処理#ifndef
するために の 14 行目に追加できるプリプロセッサ条件はありますか?main.c
または、これを処理するための別のより良い方法はありますか?
編集:私は次の解決策を使用しました:
#if defined(__LP64__)
fprintf(stdout, "memory allocated on heap: %lu bytes\n", sizeof(int)*size);
#else
fprintf(stdout, "memory allocated on heap: %u bytes\n", sizeof(int)*size);
#endif