2010-03-27 28 views
9

我用MingW/MSYS编译了几个库...生成的静态库总是.a文件。 当我尝试将库链接到MSVC项目时,Visual Studio会抛出'未解析的外部符号'...这意味着.a静态库与MS C++ Linker不兼容。我认为它必须转换为MSVC兼容的.lib文件。如何在MSVC中使用用MingW编译的库?

.a和.lib只是AR档案的.o或.obj文件,那么有没有办法如何在MSVC项目中使用MingW编译的库?或者我必须编译/链接所有东西,只需要一个编译器/链接器 - 仅限MSVC /仅限于MingW?据说MingW编译器与MSVC兼容。

我读了一些关于这个主题的线索,但他们大多数人说,将文件重命名为.lib应该能够完成这项工作,但不幸的是它不适用于我。

我试着去链接的库是用C写

MSVC链接抛出这样的错误:

error LNK2019: unresolved external symbol "int __cdecl openssl_call(struct ssl_State *,int,int,int)" ([email protected]@[email protected]@[email protected]) referenced in function _main MyAPP.obj 

...和4个指从我的应用程序调用的其他功能同样的错误。

感谢您的任何建议。

+0

难道你不能编译MSVC上的一切吗? –

+0

“.a和.lib只是.o或.obj文件的AR存档”您确定msvc的静态.lib文件就像.a“ar”存档一样吗? –

+0

看起来像这个问题(和答案)是特定于C而不是C++ ......你能证实吗? – d3vid

回答

10

基于这个错误,你加入了注释:

错误LNK2019:无法解析的外部 符号为 “int __cdecl openssl_call(结构ssl_State *,INT,INT,INT)”(openssl_call @@ YAHPAUssl_State @@ HHH @ Z)的函数引用 _main MyAPP.obj 所有其他4个错误是只一样与其他 函数的名称

尝试把extern "C" AR ound包含openssl的包含文件。例如:使用extern "C"将指示该功能是使用C链接,而不是C++编译器,其将来自于功能执行name mangling停止它

extern "C" { 
include "openssl.h" 
} 

。所以它会在库中查找函数openssl_call而不是?openssl_call @@ YAHPAUssl_State @@ HHH @。

+4

这当然是一个可能的解决方案,但如果这是真的,我感到惊讶的是,SSL本身并没有这样做 - 也许作者讨厌C++ :-) – 2010-03-27 16:29:58

9

这些库是兼容的,但前提是您需要提供C接口。 MSVC和g ++使用不同的名称修改方案,因此您无法轻松地将使用其创建的代码与使用其创建的代码链接的C++代码链接。

+1

那么,为了将MingW编译后的lib与MSVC编译的可执行文件成功链接,我该怎么做? – NumberFour

+0

@NumberFour首先,你想链接C++代码吗? – 2010-03-27 15:36:39

+0

链接库的应用程序是用C++编写的,链接的库是C(它的openssl,zlib和xerces) – NumberFour

7

我列举了在MSVC中使用mingw-compiled dll的相同情况。我用下面的工具,使其工作:
1)使用gcc这样的:

的gcc -o -shared your_dll.dll your_dll_src.c 轮候册, - 输出画质,your_dll.def

粗体指定gcc将生成脚本导出项目的* def文件。然后您需要使用lib。exe文件,它与MSVC,例如像这样的分布:

LIB /def:your_dll.def

然后,将有一个your_dll.lib文件,来自LIB.EXE(假设。 you_dll.dll位于与your_dll.def相同的目录中)。

目前,我可以在我的MSVC项目中使用* .lib并正确链接dll,但是我得到了运行时错误。无论如何,这样的作品让你的联系可行。

+0

.dll应该与.def位于同一目录中的原因是因为.def只是用于转换的元信息。现在仍然存在的问题是:如果库没有C风格接口,那么使用lib.exe进行转换是否也可以工作?这个答案提到运行时错误的事实意味着该实用程序是相当无用的... – jiggunjer