如何编译静态库? (“-static-lib ......”相当于?)

时间:2011-11-11 22:50:28

标签: c++ visual-studio-2010 static-libraries static-linking

我正在使用VS2010和 我有一个C ++项目,通过在项目属性的VC ++目录和链接器部分中包含各种条目来引用和使用外部C库(dll)。

现在我的项目正在构建,但是当它启动时,会出现一个消息框:

程序无法启动,因为您的计算机缺少ExternalCLibrary.dll。 [...]


我想知道如何在Visual Studio 2010中做相当于

的操作
  

将“-static-libgcc -static-libstdc++”添加到编译器标志中。

似乎是根据以下解决方案: The program can't start because libgcc_s_dw2-1.dll is missing

4 个答案:

答案 0 :(得分:2)

  1. 在Visual Studio中加载项目。
  2. 右键单击您的项目 选择“属性”。
  3. 找到树上的“链接器”部分 左侧。
  4. 从下拉列表中选择所有配置和所有平台 对话框顶部的菜单。
  5. 添加额外的静态库 输入 - >中的依赖关系附加依赖项字段,分号分隔。
  6. 如果libs不在您的lib搜索路径上,请使其适当 常规 - >中的条目其他图书馆目录字段,分号 分隔。
  7. 应用,保存,编译,运行。

答案 1 :(得分:0)

您不能将dll用作静态库(这就是它们被称为动态链接库的原因)。为了编译静态库,您将获得该库的源代码。获得源代码后,转到项目设置General->Configuration Type并将其设置为Static Library(.lib)。然后在您的程序中,您需要通过将库名称放在Linker->Input->Additional Dependencies

中来添加该库

答案 2 :(得分:0)

根据你的问题传递给gcc的两个标志告诉gcc将运行时库静态链接到可执行文件或共享库/ dll。这不太可能是您的问题的问题,因为您引用的错误消息的一部分表明ExternalCLibrary.dll没有正确构建。

如果DLL存在,请使用依赖于walker的工具来确定无法加载DLL的哪个依赖项;那可能是罪魁祸首。

如果不存在ExternalCLibrary.dll,那么你需要找出你应该从哪里获取它,但是如果你的项目构建并且它作为依赖项在项目中列出,那么我的猜测是它是一个问题加载程序无法在运行时找到此DLL的依赖项。

答案 3 :(得分:0)

这个过程很简单,但是你需要注意几件事情。第一件事,如果您的lib是用C语言编写的,那么在包含C的每个源代码的头文件中,我们都会使用以下内容。

#ifdef __cplusplus
extern "C" {
#endif

// C functions

#ifdef __cplusplus
}
#endif

完成后,使用ar rcs [YOUR OBJECT FILES]将库编译为静态库。最后要做的是使用c ++编译器将库与项目中的目标文件链接起来。现在需要标志来链接库。