2010-02-11 70 views
3

庫可以在應用程序中使用的方法有兩種:如何使用`static鏈接`和`動態鏈接`使用gcc和Visual Studio構建一個C/C++程序?

  1. 靜態鏈接
  2. 動態鏈接

但如何同時使用的Visual Studio(窗口)& GCC這樣做呢?

我知道庫僅分佈在這4個方面:

  1. 來源
  2. 只有頭的庫
  3. * .lib文件的窗口。 * .a for linux
  4. * .dll(windows)& * .so(linux)。

source distribution is just compiled。「header-only libraries」只是一個源碼分發。

現在如果所需的庫分佈在* .lib窗體中。爲了使用它。

視覺Stuido

  1. 我們添加到配置屬性>一般包含頭文件(* H)目錄路徑>附加包含目錄
  2. 我們每個*的.lib文件添加到配置屬性>鏈接器>輸入>其他依賴關係
  3. 我們將* .lib文件的目錄路徑添加到:配置屬性>鏈接器>附加L文庫目錄

如何爲GCC/MingW做同樣的事情? 我不知道如何構建我的應用程序時庫也分發爲* .dll或* .so太。有人可以告訴我在Visual Studio(windows)和GCC(linux)/ mingw(windows)在這些情況下需要做什麼

+0

你問如何使用mingw和GCC庫,或者如何混合GCC和VC++庫? – 2010-02-11 21:14:46

+0

我在問如何使用mingw和GCC庫。順便說一句..混合GCC和VC++庫是一個問題? – pecker 2010-02-11 22:47:00

+0

有三個問題:如何使用gcc的靜態庫,如何構建DLL,如何構建.so。最好問三個不同的問題。 – 2012-08-11 22:36:07

回答

1

對於DLL發行版,情況類似於.lib文件。 (你的#3)

你將不得不配置你的項目來建立一個DLL。該項目將建立LIB和DLL文件。

根據您的需求/建築/設計您可以針對就像你在上面的#3做LIB文件

  • 鏈接。請注意,DLL文件必須在運行時存在於目標機器上,否則應用程序將無法加載。

  • 從客戶端應用程序調用「LoadLibrary()」並跳過鏈接部分/不需要在客戶端應用程序中使用LIB。

我不能幫你解決gcc的具體問題。

+0

我很抱歉,但我沒有得到你想要回答的問題。我的問題不是「如何生成* .dll/* .lib庫分發?」。它是'如何使用以* .DLL形式發佈的庫?' – pecker 2010-02-11 23:00:21

+0

這也是我的答案。查看分項/列表部分。 – Tim 2010-02-11 23:26:39

3

在GCC上,對於靜態鏈接,您將在命令行中包含該庫。假設你有glib-2.0.lib,並且你使用GLib庫的程序是my_prog.c,那麼你調用GCC爲 gcc my_prog.c -L<library_dir_here> -lglib-2.0

至於DLL等,動態庫是你沒有鏈接到你的程序通過傳遞給你的鏈接器。相反,操作系統爲您提供了在運行時需要時加載它們的功能。這就是它被稱爲動態的原因。在Windows中,您有LoadLibrary,而在Linux上,您有dlopen。這兩個函數都會得到一個字符串(這是dll或者這樣的名字),並且如果它在機器上可用的話就加載它。加載完成後,通過在Windows上傳遞名稱GetProcAddress和在Linux上傳遞dlsym來查找庫中所需的函數;兩者都返回一個函數指針,您可以使用該指針調用該函數。由於您不是直接直接調用庫提供的函數,而是直接調用函數指針,所以在構建應用程序時,不需要靜態鏈接它們(即將它們傳遞給鏈接器)。

+0

謝謝。這很清楚。因此,與* .so/*。dll文件不同,靜態庫不包含「導出表」? – pecker 2010-02-12 14:30:48

+0

@Pecker:是的,導出符號與動態庫有關;在靜態庫中,它並不明確地輸出符號,而在動態共享對象中,它在創建時被操縱。有關VC++,請參閱http://msdn.microsoft.com/en-us/library/z4zxe9k8%28VS.80%29.aspx「;有關GCC,請參閱http://gcc.gnu.org/wiki/Visibility。 如果你喜歡堆棧溢出的答案,你可以通過點擊它旁邊的勾號來接受它:) – legends2k 2010-02-12 17:31:34

+0

你給的msdn鏈接似乎沒有工作 – pecker 2010-02-12 19:11:45