用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,用它来代替。

  • 链接地址: http://www.djcxy.com/p/64369.html

    上一篇: With Mingw created static library link into VS2008 project?

    下一篇: building static library (.lib) VS 2010 Pro