如何使用 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)