Я создаю статическую библиотеку из одного объектного файла. Сгенерированный файл .a имеет метку времени с разрешением в одну секунду (усеченную до более ранней секунды), а файл .o — нет.
По сути, это делает файл .a более старым, чем файл .o, и библиотека перестраивается в следующий раз, когда я make
.
Я слышал, что такие проблемы могут быть на Mac, но я использую Ubuntu, x64.
Пытаясь понять, что происходит, я сделал более простой проект, чтобы показать поведение. Но в этом случае все работает так, как я ожидаю:
gauthier@sobel:~/tmp/ar_test $ ls
hello.c makefile
gauthier@sobel:~/tmp/ar_test $ make
gcc -c hello.c -o hello.o -g -Wall -Wextra -Werror -O3 -lrt
ar -cvq hello.a hello.o
a - hello.o
gauthier@sobel:~/tmp/ar_test $ ls --full-time
total 28
-rw-rw-r-- 1 gauthier gauthier 11940 2014-11-21 09:55:22.131715135 +0100 hello.a
-rw-rw-r-- 1 gauthier gauthier 81 2014-11-20 15:14:34.419613737 +0100 hello.c
-rw-rw-r-- 1 gauthier gauthier 5864 2014-11-21 09:55:22.131715135 +0100 hello.o
-rw-rw-r-- 1 gauthier gauthier 254 2014-11-20 15:17:47.533185970 +0100 makefile
gauthier@sobel:~/tmp/ar_test $ make
make: Nothing to be done for `all'.
Там все работает, hello.a
имеет метку времени, равную hello.o
.
Вернемся к моему исходному проекту. Я не могу понять, в чем разница, но временная метка для библиотеки заполнена нулями после секунд:
gauthier@sobel:~/code/myproj (master) $ ls
makefile README.md test myproj.c myproj.h
gauthier@sobel:~/code/myproj (master) $ make
gcc -c myproj.c -o myproj.o -g -Wall -Wextra -Werror -O3 -lrt -pthread
ar -cvqU libmyproj.a myproj.o
a - myproj.o
gauthier@sobel:~/code/myproj (master) $ ls --full-time
total 64
-rw-rw-r-- 1 gauthier gauthier 18852 2014-11-21 10:03:59.000000000 +0100 libmyproj.a
-rw-rw-r-- 1 gauthier gauthier 1363 2014-11-21 09:53:09.397383831 +0100 makefile
-rw-rw-r-- 1 gauthier gauthier 106 2014-11-20 13:49:15.299969786 +0100 README.md
drwxrwxr-x 2 gauthier gauthier 4096 2014-11-20 13:49:15.303969736 +0100 test
-rw-rw-r-- 1 gauthier gauthier 4741 2014-11-20 13:49:15.303969736 +0100 myproj.c
-rw-rw-r-- 1 gauthier gauthier 3584 2014-11-20 15:05:10.554702000 +0100 myproj.h
-rw-rw-r-- 1 gauthier gauthier 18648 2014-11-21 10:03:59.861206394 +0100 myproj.o
gauthier@sobel:~/code/myproj (master) $ make
ar -cvqU libmyproj.a myproj.o
a - myproj.o
Обратите внимание на отметку времени libmyproj.a
: 10:03:59.000000000.
Я пробовал оба варианта -U
и -D
до ar
без av (не то чтобы я действительно думал, что это должно иметь значение).
После дальнейшего изучения похоже, что проблема зависит от того, в каком каталоге находятся файлы:
Если я скопирую
~/code/myproj/myproj.o
в тестовый каталог~/tmp/ar_test/myproj.o
и запущуar -cvq libmyproj.a myproj.o
там, отметка времени будет правильной.Если я скопирую
~/tmp/ar_test/hello.o
в расположение исходного проекта~/code/myproj/hello.o
и запущу тамar -cvq libhello.a hello.o
, отметка времени будет неверной.
Другими словами: ar
генерирует усеченные метки времени, когда я нахожусь в ~/code/myproj
, но не когда я нахожусь в ~/tmp/ar_test
.
Что может заставить библиотеку потерять нижнюю часть метки времени, в зависимости от того, в каком каталоге я нахожусь?
~/tmp
и~/code
? Какиеmount
опции используются? - person Axel   schedule 21.11.2014touch myproj.o
после ar. - person Axel   schedule 21.11.2014~/code
относится к типуfuse.encfs
.~/tmp
этоext4
. Но почему другие файлы получают метки времени с высоким разрешением, а файлы.a
— нет? - person Gauthier   schedule 21.11.2014