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 |