我從單個對象文件創建一個靜態庫。生成的.a文件具有時間戳,分辨率爲1秒(截斷到較早的秒),而.o文件不包含。用ar創建的靜態庫具有分辨率爲1的時間戳s
實際上,它使得.a文件看起來像它比.o文件更舊,並且在下次我重新創建該庫時make
。
我聽說Mac可能存在這樣的問題,但我使用Ubuntu,x64。
爲了理解發生了什麼,我做了一個更簡單的項目來顯示行爲。但是,在這種情況下,所有工作如我所料:
[email protected]:~/tmp/ar_test $ ls
hello.c makefile
[email protected]:~/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
[email protected]:~/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
[email protected]:~/tmp/ar_test $ make
make: Nothing to be done for `all'.
有它的工作,hello.a
具有相等的hello.o
時間戳。
回到我原來的項目。我無法找出什麼是不同的,但對於lib中的時間戳秒後用零填充:這裏
[email protected]:~/code/myproj (master) $ ls
makefile README.md test myproj.c myproj.h
[email protected]:~/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
[email protected]:~/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
[email protected]:~/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
。
什麼可以使lib丟失時間戳的下半部分,取決於我在哪個目錄?
這可能是文件系統問題嗎?什麼文件系統是'〜/ tmp'和'〜/ code'?使用什麼'mount'選項? – Axel 2014-11-21 09:37:13
PS:作爲一個快速和骯髒的修復,嘗試在ar之後添加'touch myproj.o'命令。 – Axel 2014-11-21 09:39:05
是的!我想你可能是對的! '〜/ code'類型爲'fuse.encfs'。 '〜/ tmp'是'ext4'。但爲什麼其他文件會得到高分辨率的時間戳,'.a'文件不會呢? – Gauthier 2014-11-21 10:03:54