Visual studio中的「添加引用」是什麼意思?
MSDN中「演練:創建和使用靜態庫 (C++)」中指出在同一個解決方案中,一個項目要使用另一項目編譯生成的靜態庫,需要「添加引用」。請問這裡的添加引用是什麼意思,背後的工作原理是什麼。與在不同解決方案中的項目通過配置屬性頁使用靜態庫有什麼區別。
參考鏈接:https://msdn.microsoft.com/zh-cn/library/ms235627.aspx
這一個是來自鏈接的術語,引用即reference.
舉一個簡單的例子:
// a.cpp
extern int foo(); // in the foo.o
int main()
{
foo();
}
我們說a.cpp裡面使用外面的foo函數,即foo函數本身的定義不在a.cpp裡面,那麼在鏈接層面我們會說a.cpp(或者更準確的說是編譯出來的目標文件a.o)引用了外部foo函數的符號(Symbol)[1],即我們經常看到的symbol referenced from....,也會看到的錯誤unresolved symbol of .......。添加引用則是什麼呢?如這裡的例子,a.cpp(或者更準確的說是編譯出來的a.o),鏈接器需要找到main函數裡面使用的foo函數符號,而在a.o裡面沒有,那麼我們則需要添加包含有foo函數的符號,如foo.o,那麼你就可以使用ld a.o foo.o,或者說在一個靜態庫foo.a中,那麼則是ld a.o foo.a 所以,添加引用即是添加所需要(引用)的符號用於鏈接器查找與使用,最後生成目標文件。
推薦書籍:程序員的自我修養。這本書告訴了程序的編譯、鏈接等原理。
[1] 符號,Symbol,這一個來自編譯層面的術語。編譯器會把源代碼層面的函數等作為標記符(identifier),然後把這些標記符放入一個名叫符號表(Symbol Table)的數據結構中。補充一下藍色大大的回答,在VS中,添加引用還隱式地指定了項目之間編譯順序的偏序關係,被引用的工程會先編譯
簡單的理解的話,可以說
把
別人寫好的程序集添加入自己的程序中。!答主不熟悉 C++,但 C# 中,引用可是相當有用。
比如我今天從 GitHub 上 Fork 了項目 A。
項目 A 中有很多可供調用的方法,他自己也給自己寫有方法。那麼*他自己給自己寫的方法*,*他自己*是可以調用的。我將項目 A, Clone 到 本地。再給我自己的項目 B 添加 A 的引用。那麼等於說,我把 B 的代碼 添到了 A 中,現在我可以使用*他給自己寫的方法*了。
再舉個實際例子。
我有 A 項目 和 B 項目 兩個項目。A 項目 → 直接編譯 → A.dll我在設計 A 項目時,A 項目內有一個 "publicMethods.cs"這裡面包含一個 class, 裡面又包含各種常用函數。比如 public static string time(){return Now.ToString();}而 A 項目內還有一個 "referring.cs".referring.cs 里 有一個 public static string gRslt()而 gRslt() 可以調用 "publicMethods.cs" 里的 public static string gTime(), 因為它們在同一個項目下。那麼現在我編譯 A.dll.我再把 A.dll 添入 B 項目中。那麼現在 B 項目也可以使用 gRslt() 和 gTime() 這兩個函數了。因為我把 A.dll 「引用」到了 B 項目 中。那麼我就可以在 B 項目 中用到 A 項目 的公共函數。注: C#, Visual Basic .NET 編譯後均為 IL 文件(託管代碼),所以可以互相自由引用。
所以 C# 和 Visual Basic .NET 也可以很輕鬆地互相翻譯 ——因為二者編譯出來幾乎沒區別好嗎ヾ(???ゞ)至於原理,@藍色 答主的回答已經足夠詳細,請轉為查看。推薦閱讀:
※C++中的數組與指針的一個小疑惑?
※C++解析xml有什麼好用的輪子?
※為什麼Python里類中方法self是顯式的,而C++中this是隱式的?
※同一段代碼,為什麼有的編譯器能編譯通過,有的不能?
※有什麼很好的軟體是用 Qt 編寫的?
TAG:C | MicrosoftVisualStudio |