コンパイル時にソース ファイルのベース名を取得する

make を使用している場合 プログラムでは、事前にファイル名を変更し、それをマクロとして gcc に渡すことができるはずです プログラムで使用します。たとえば、 makefile で 、行を変更します:

file.o: file.c
    gcc -c -o file.o src/file.c

へ:

file.o: src/file.c
    gcc "-DMYFILE=\"`basename $<`\"" -c -o file.o src/file.c

これにより、 MYFILE を使用できるようになります __FILE__ の代わりにコードで .

basename の使用 ソースファイル $<.c.o などの一般化されたルールで使用できることを意味します .次のコードは、その仕組みを示しています。まず、makefile :

mainprog: main.o makefile
    gcc -o mainprog main.o

main.o: src/main.c makefile
    gcc "-DMYFILE=\"`basename $<`\"" -c -o main.o src/main.c

次に、サブディレクトリ src/main.c 内のファイル :

#include <stdio.h>

int main (int argc, char *argv[]) {
    printf ("file = %s\n", MYFILE);
    return 0;
}

最後に、実行中のトランスクリプト:

pax:~$ mainprog
file = main.c

file = に注意してください のみを含む行 ディレクトリ名ではなく、ファイルのベース名。


直接的な方法はわかりません。以下を使用できます:

#line 1 "filename.c"

ソースファイルの先頭で __FILE__ の値を設定します 、しかし、それがハードコーディングよりもはるかに優れているかどうかはわかりません。または、#define を使用して独自のマクロを作成します。

別のオプションとして、-D と $(shell basename $<)

を使用して Makefile から名前を渡すこともできます。

編集:#define または -D オプションを使用する場合は、独自の新しい名前を作成し、__FILE__ を再定義しないでください。 .


この単純なソース コードを検討してください:

#include <stdio.h>
int main(void)
{
    puts(__FILE__);
    return(0);
}

Solaris では、GCC 4.3.1 を使用して、これをコンパイルすると:

gcc -o x x.c && ./x

出力は 'x.c ' 次を使用してコンパイルした場合:

gcc -o x $PWD/x.c && ./x

__FILE__ はフルパス ('/work1/jleffler/tmp/x.c ')。次を使用してコンパイルした場合:

gcc -o x ../tmp/x.c && ./x

__FILE__ は '../tmp/x.c にマップされます '.

つまり、基本的に __FILE__ はソース ファイルのパス名です。オブジェクトに表示したい名前でビルドすれば、すべて問題ありません。

それが (何らかの理由で) 不可能な場合は、他の人が提案した修正に取り掛かる必要があります。