2011-11-11 21 views
1

我正在使用VS2010和 我有一个C++项目引用和使用外部C库(DLL),通过在VC++目录和链接器部分项目属性。如何编译静态库? (“-static-lib ...”等效?)

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

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


我想知道如何在Visual Studio 2010中做的

相当于加入 “-static-libgcc -static-libstdc++” 你的编译器标志。

似乎根据是解决办法: The program can't start because libgcc_s_dw2-1.dll is missing

+0

@MichaelPrice:对不起,澄清:p – ibiza

+0

那么,这个DLL在哪里?如果它不在你的.exe目录中,那么Windows有很小的几率找到它。项目属性不起作用,它们只用于构建时,而不是运行时。 –

+0

@HansPassant:它位于/ lib目录中的dll,相对于exe。我怎样才能将这个指定给我的程序?我不希望它在同一个exe的目录中... – ibiza

回答

2
  1. 装载该项目在Visual Studio。
  2. 右键单击您的项目并选择 选择属性。
  3. 找到左侧的 树上的“链接器”部分。
  4. 从对话框顶部的下拉菜单 中选择所有配置和所有平台。
  5. 将您的附加静态库 依赖项中的输入 - >附加依赖项字段,以分号分隔。
  6. 如果库不在您的lib搜索路径中,请在常规 - >附加库目录字段中输入合适的 条目,分号为 。
  7. 应用,保存,编译,运行。
+0

它似乎只有'附加库',没有'附加库目录'字段? http://i.imgur.com/Oqx9R.png – ibiza

+0

@ibiza对不起......当我从记忆中输入时,有些名字是错误的......现在编辑。 –

+1

另外,这些是在库上添加依赖关系的说明。如果该静态.lib与.dll配对,则.dll必须位于运行时可执行文件搜索路径上(很可能应与可执行文件位于同一目录中)。 –

0

你不能使用dll作为静态库(这就是为什么他们被称为动态链接库)。为了编译一个静态库,你会得到这个库的源代码。获得源代码后,转至项目设置General->Configuration Type并将其设置为Static Library(.lib)。然后在你的程序中,你需要通过把库名添加到库中Linker->Input->Additional Dependencies

+0

好吧,我也已经这样做了,我的dll和库都有正确的设置项目属性。我如何向程序指示使用静态版本? – ibiza

+0

你不需要。只需在'Linker-> Input-> Additional Dependencies'中包含该库名称并包含头文件并使用这些函数即可。 – JosephH

+0

请参阅http://msdn.microsoft.com/en-us/library/ms235627.aspx的完整步骤 – JosephH

0

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

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

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

+0

嗨,谢谢,ExternalCLibrary.dll正确构建,如果我添加我的dll路径到PATH环境变量,整个应用程序工作 – ibiza

+0

这将是有道理的,因为装载机检查不在当前目录中的DLL的路径变量你可能想要考虑配置你的项目,以便所有依赖的DLL最终在同一个导向器中y作为避免这个问题的主要应用。 –

0

这个过程很简单,但你需要注意几件事情。首先,如果你的lib是用C编写的,在每个包含C函数源的头文件中我们使用下面的代码。

#ifdef __cplusplus 
extern "C" { 
#endif 

// C functions 

#ifdef __cplusplus 
} 
#endif 

一旦你做到了这一点,编译库将使用ar rcs [YOUR OBJECT FILES]静态库。最后要做的是我们C++编译器将库与项目中的对象文件链接起来。现在需要标志来链接库。