2012-10-12 35 views
8

我用GoogleTest測試我的C++項目建立了一個靜態庫,並發現預編譯庫已不再分佈在Ubuntu的軟件包之後,我發現這個項目網站上的以下內容:它是安全的鏈接到不同的編譯器標誌

如果您在使用不同的編譯器 標誌編譯谷歌測試和測試代碼,他們可能會看到相同的 類/函數/變量(例如,由於在谷歌測試使用的#if的)不同的定義。 因此,爲了您的理智,我們建議您避免安裝 預編譯的Google Test庫。相反,每個項目 都應編譯Google測試本身,以確保Google測試和測試都使用相同的 標誌。

我從中得出的結論是,從正在測試的項目中單獨編譯GoogleTest是一個壞主意。我不明白的是,這只是一個GoogleTest的事情,或者這是鏈接庫的一般事情。

問題

是否有這是不安全的鏈接到預編譯的第三方庫,編譯器標記或其他方式,如果沒有任何情況下,有什麼特別之處GoogleTest?

+0

你的報價似乎缺少的重要組成部分:'如果您在使用不同的編譯器編譯的標誌谷歌測試和測試代碼,他們可能會看到相同的類/函數/變量(如不同的定義,由於使用的#if的在谷歌測試)。' –

+0

我用你指出的位更新了報價。 –

回答

6

有一些編譯器標誌,特別是那些與校準作業,這可能導致一個問題。

GCC i386 and x86-64 flags

-malign雙
-mno對齊雙

GCC控制是否對齊雙字邊界上雙,長雙,和長長的變量或一個單詞的邊界。在雙字邊界上對齊雙變量產生的代碼在Pentium上運行速度稍快,但代價是內存更多。

在x86-64上,默認情況下啓用-malign-double。

警告:如果您使用-malign雙開關,包含上述類型的結構比發佈的應用程序二進制接口規格爲386和 對齊方式不同是不是二進制與沒有這種開關編譯代碼結構兼容。

例如,使用該標誌的32位系統上將爲雙打和長多頭是64位對齊的。如果您編譯一個沒有該標誌的庫,然後嘗試在使用該標誌時使用該庫,則包含上述類型的結構可能具有不同的對齊方式,並且可能無法互操作。

其他(更簡單)的情況下,也可以保證同一組的#define,以確保相同的功能/結構/類定義使用(和其他此類違法行爲ODR)。例如,在gcc中使用'--std = C++ 11',它可以啓用標準庫類的C++ 11版本,在某些情況下,這些版本與以前的版本不同。

+1

's/will/may/g' - 取決於運氣,圖書館實際上可能工作得很好。 –

相關問題