如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?

Posted

技术标签:

【中文标题】如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?【英文标题】:How can I build a C/C++ program using `static linking` & `Dynamic linking` with gcc & Visual studio? 【发布时间】:2010-02-11 20:47:03 【问题描述】:

可以通过两种方式在应用程序中使用库:

    静态链接 动态链接

但是如何同时使用 Visual Studio (windows) 和 GCC 来做到这一点?

我知道库仅以这 4 种方式分发:

    来源 仅标头库 *.lib 文件用于 Windows。 *.a 用于 linux *.dll (windows) & *.so (linux)。

源代码分发只是编译。“仅头文件库”不过是源代码分发。

现在,如果所需的库以 *.lib 形式分发。为了使用它。

Visual Stuido 上:

    我们将包含标头 (*.h) 的目录路径添加到 Configuration Properties > General > Additional Include Directories 我们将每个 *.lib 文件添加到 Configuration Properties > Linker > Input > Additional Dependencies 我们将 *.lib 文件的目录路径添加到:配置属性 > 链接器 > 附加库目录

如何为 GCC/MingW 做同样的事情? 当库也作为 *.dll 或 *.so 分发时,我不知道如何构建我的应用程序。有人可以告诉我在这些情况下我需要为 Visual Studio (windows) 和 GCC(linux)/mingw(windows) 做什么

【问题讨论】:

您是问如何使用mingw和GCC库,或者如何混合使用GCC和VC++库? 我在问如何使用 mingw 和 GCC 库。顺便说一句.. 混合 GCC 和 VC++ 库会是个问题吗? 你有三个问题:如何在 gcc 中使用静态库,如何构建 DLL,如何构建 .so。最好问三个不同的问题。 【参考方案1】:

在 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 来查找您需要从库中获取的函数;两者都返回一个函数指针,您可以使用它调用该函数。由于您不是直接调用库提供的函数,而是通过函数指针直接调用,因此您无需在构建应用程序时静态链接它们(即将它们传递给链接器)。

【讨论】:

谢谢。这是非常清楚的。那么,与 .so/.dll 文件不同,静态库不包含“导出表”? @Pecker:是的,导出符号与动态库有关;在静态库中,它不是明确的符号,也不是专门导出的,而在动态共享对象中,它是在创建时进行操作的。对于 VC++,请参阅 msdn.microsoft.com/en-us/library/z4zxe9k8%28VS.80%29.aspx";对于 GCC,请参阅 gcc.gnu.org/wiki/Visibility。如果您喜欢 Stack Overflow 中的答案,您可以点击旁边的勾号接受它:) 从 DLL 导出:msdn.microsoft.com/en-us/library/z4zxe9k8(VS.80).aspx 这是您要提供的链接吗? 是的,这就是链接;抱歉,这是一个错字。【参考方案2】:

对于 DLL 发行版,场景类似于 .lib 文件。 (你的#3)

您必须配置您的项目以构建 DLL。该项目将构建 LIB 和 DLL 文件。

根据您的需求/架构/设计,您可以选择

链接到 LIB 文件,就像您在上面的 #3 中所做的那样。请注意,DLL 文件在运行时必须存在于目标机器上,否则应用程序将无法加载。

从客户端应用程序调用“LoadLibrary()”并跳过链接部分/无需在客户端应用程序中使用 LIB。

我无法帮助您解决 gcc 的具体问题。

【讨论】:

很抱歉,我没有得到您想要回答的内容。我的问题不是“如何生成 *.dll / *.lib 库分发?”。是how to use a library distributed as *.DLL? 这也在我的回答中。请参阅逐项/列表部分。

以上是关于如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?的主要内容,如果未能解决你的问题,请参考以下文章

将 GCC/ATT 风格的汇编器转换为 Visual Studio 汇编器?

是否有可以将 Visual Studio 目标文件转换为 GCC 格式的工具?

如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)

单击问题窗口时,在Visual Studio代码上找不到文件错误(使用make,gcc和gcc problemMatcher)

为啥使用 Visual Studio 而不是 GCC 编译时没有错误?

为啥 cygwin 使用 Visual Studio BuildTools 而不是 gcc?