用Mingw在VS2008项目中创建了静态库链接?
我想做什么? ...
首先,用MinGW的g ++编译器创建静态库。
所以,简单的示例文件是...
test.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <iostream>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef EXPORT_DLL_FUNCT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API void __stdcall whatever( int a, int b );
#ifdef __cplusplus
}
#endif
#endif // EXAMPLE_H
TEST.CPP
#include "test.h"
__stdcall void whatever( int a, int b ) {
std::cout << "whatever printout !!!" << std::endl;
int c = a + b;
}
当我使用编译器命令时:
g++ -c -DEXPORT_DLL_FUNCT test.cpp -o test.o
和
g++ -shared test.o -o libtest.dll -Wl,--out-implib=libtest.a
文件“libtest.dll”和“libtest.a”被创建。 为什么需要两个? 因为,如果你打算在VS2008项目中使用库(MSVC ++),那么这两个文件都是必需的 - 我在MinGW的网站上读到了这个文件。
接下来...我创建了VS2008 Win32控制台应用程序项目,它将从库中调用函数“whatever”。
main.cpp中
#include "../mingw/test.h"
#include <iostream>
void main(void)
{
std::cout << "n*** start ***" << std::endl;
whatever(3, 2);
std::cout << "n*** end ***" << std::endl;
}
在VS2008中:“属性 - >链接器 - >常规 - >其他库目录”我添加了以前创建的库的路径,并在“属性 - >链接器 - >输入 - >附加依赖项”中添加了“libtest”。一份文件。 当我建立项目,comile和链接是好的,exe文件生成,但当我尝试运行EXE ... segmentatin故障发生(是,“libtest.dll”与.exe文件在同一文件夹中)! 我不知道为什么? 在代码中使用“__stdcall”,所以在堆栈中推送东西时应该没有问题。
有什么建议吗?
感谢您的回答。 你的建议帮助了我很多! 让我们看看现在的解决方案......首先,部分原因是我的脱离感......我只是“忘记”检查是否在任何情况下.exe在Debug模式下在VS2008中生成时工作。 答案是肯定的。 :)所以,在调试模式下,上面的例子效果很好! 但仍然无法在发布模式下工作。 那么,这里的解决方案也适用于发布模式:在VS2008项目中,将链接器 - >优化 - >引用设置为否(/ OPT:NOREF) 。 就这样 ...
我对此没有一个很好的解释,但是对于VS 2010,如果我在VS编译行(启用调试符号的所有选项)中添加/Zi
, /ZI
或/Z7
,应用程序将正确运行并调用MinGW图书馆。 我最初认为这意味着VS中的优化器造成了问题,但是指定/Od
并不能防止分段错误。
尽管由GCC创建的导入库符合“归档”(.a或.lib for vc)的标准,并且归档中的对象文件也符合COFF标准,但它与VC的方式不兼容。
我探索了由vc,implib sdk和gcc创建的导入库,发现那些由gcc和implib sdk创建的库相似。 最令人印象深刻的区别是,implib sdk的成员(存档内的对象文件)的名称是相同的,对于gcc来说它们是不同的。 VC的链接器不会拒绝链接到gcc的导入库,但会构建一个格式不正确的exe。
你可以看看implib sdk,它可以创建一个与vc一起工作的导入库。 但是一些限制非常恼人,比如dll的文件名长度,字符集等等。
使用vc的链接器创建一个导入库是一个好方法。 确保创建的导入库与您的源代码兼容。 对于你的情况,你可以尝试一下:
像这样写一个.def文件
LIBRARY libtest
EXPORTS
whatever@8
保存为libtest.def
使用链接器创建导入库:
link /lib /out:libtest.lib /def:libtest.def
现在你有libtest.lib,用它来代替。
上一篇: With Mingw created static library link into VS2008 project?