2014-11-21 22 views
0

我從單個對象文件創建一個靜態庫。生成的.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-Dar,沒有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丟失時間戳的下半部分,取決於我在哪個目錄?

+0

這可能是文件系統問題嗎?什麼文件系統是'〜/ tmp'和'〜/ code'?使用什麼'mount'選項? – Axel 2014-11-21 09:37:13

+0

PS:作爲一個快速和骯髒的修復,嘗試在ar之後添加'touch myproj.o'命令。 – Axel 2014-11-21 09:39:05

+0

是的!我想你可能是對的! '〜/ code'類型爲'fuse.encfs'。 '〜/ tmp'是'ext4'。但爲什麼其他文件會得到高分辨率的時間戳,'.a'文件不會呢? – Gauthier 2014-11-21 10:03:54

回答

0

感謝@Axel,問題解決了。我正在寫這個解決方案,希望它能夠幫助別人在這裏搜索他們的方式。

~/code(其中時間戳被截斷)是fuse.encfs類型的文件系統。不知何故,ar似乎無法在這種類型的文件系統中創建完整的時間戳。這很奇怪,因爲其他文件會得到正確的時間戳(例如,gcc會爲目標文件生成整個時間戳)。

我的解決方案是在ext4 FS中工作,並以另一種方式處理加密(這是點的encfs)。