2009-06-12 132 views
4

我有我要分發具有靜態庫包括的foo.c /小時,有人拾起,包括我在他們的應用程序靜態庫。靜態庫,鏈接和依賴

說,他們也有foo.c的/小時在他們的應用程序。他們是否有鏈接錯誤?

回答

7

源文件的名稱在鏈接過程中並不重要。

如果文件具有相同的內容,那麼你將有一個問題,假設.c文件包含導出的符號(例如非靜態或非模板函數,或EXTERN變量)。

3

這取決於。如果foo.c和foo.h定義了相同的函數和/或變量,那麼是的,會有多個定義錯誤。如果他們只有相同的文件名,但包含不同的代碼,則不會有問題。

0

如果你給出你的靜態庫,你不需要包含foo.c,因爲這將是lib的一部分,如果他們有自己的foo.c,它會混淆編譯器和鏈接器,並可能導致問題,如果你們都有類似的功能,或者它會包含錯誤的標題。

你解決這個最好的方法是使用一個命名空間因而你的代碼保持它的獨特。

namespace myfooname 
{ 

void foo() 
{ 
//stuff 
} 


} 
2

鏈接的文件名
本身有問題最少的連接器,但有些IDE的會抱怨,如果文件被添加 - 即使他們是在不同的文件夾。但這通常不是什麼大問題。

不要發佈靜態庫(無源)

首先,你不應該獨自重新分配一個靜態庫。代碼和兼容性取決於編譯器,許多常用設置,比如哪些運行時庫(靜態/動態,調試/釋放,單線程已經從VC中解脫出來),一些C++設置,例如異常處理,虛擬成員函數指針表示等等。你最終需要構建數百種變體來支持主流編譯器,而且你最終還是需要一些與之相似的人。

始終包括源,因此用戶可以重建他的箱子靜態庫。或者使用動態庫 - 但它有自己的陷阱。

命名空間
如所提到的,使用命名空間來避免衝突。不要過量,如果你有源代碼,用戶可以隨時重新命名它。但請記住,using namespace聲明不應出現在標題中,因此代碼需要稍微調整。

+1

所有你提到靜態庫,造成問題的問題,也與任何編譯的代碼會導致問題的DLL,確實。 – 2009-06-12 07:49:08