Линкеры видят глобальные переменные как адреса (указатели на «фактический» глобальный объект, а не на фактический глобальный объект, даже если фактический глобальный объект не существует по этому адресу). -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d)
устанавливает адрес of __BUILD_DATE
, а не значение. Когда у объекта компоновщика __BUILD_DATE
есть адрес, но нет значения, вы можете получить адрес, объявив объект как что-либо, а затем взяв адрес этого.
В
#include <stdio.h>
//extern long __BUILD_DATE[128];
//extern int __BUILD_DATE;
extern char __BUILD_DATE;
int main(void)
{
printf("Build date: %lu\n", (unsigned long)&__BUILD_DATE);
}
Любое из трех объявлений должно работать. Только не пытайтесь использовать значение этого (псевдо) глобального. Это было бы как разыменование неверного указателя.
Это должно ответить на 2 и 3. Для ответа 1 -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d)
сохраняет число, возвращаемое (стандартный вывод) под $(date %Y%m%d)
, как адрес __BUILD_DATE
. Он не хранит строку.