Если вы используете программу грим, вы должны быть в состоянии munge имя файла заранее и передать его в качестве макроса ССАГПЗ для использования в вашей программе.
В вашем сборочном файле измените строку:
file.o: file.c
gcc -c -o file.o src/file.c
к:
file.o: src/file.c
gcc "-D__MYFILE__=\"`basename $<`\"" -c -o file.o src/file.c
Это позволит Вам использовать __MYFILE__
в коде вместо __FILE__
.
Использование базового имени исходного файла ($ <) означает, что вы можете использовать его в общих правилах, таких как «.c.o».
Следующий код иллюстрирует, как он работает.
Makefile Файл:
mainprog: main.o makefile
gcc -o mainprog main.o
main.o: src/main.c makefile
gcc "-D__MYFILE__=\"`basename $<`\"" -c -o main.o src/main.c
Файл ЦСИ/main.c:
#include <stdio.h>
int main (int argc, char *argv[]) {
printf ("file = %s\n", __MYFILE__);
return 0;
}
Run из оболочки:
[email protected]:~$ mainprog
file = main.c
[email protected]:~$
Обратите внимание на строку «file =», которая содержит только базовое имя файла, а не имя dirname.
Файла name - это имя, указанное компилятору. – 2008-10-26 04:32:31
У моего источника есть структура каталогов, поэтому я не могу передать только имя файла компилятору. Кроме того, я использую CMake, который, кажется, всегда дает полный путь. Я думаю, что этот вопрос должен содержать тег C++, потому что шаблонное метапрограммирование может быть допустимым ответом? – Imbue 2008-10-26 04:40:52