创建一个MSVC库,使得MinGW可以链接。

4
我正在尝试使用MS Visual Studio 2012创建一个静态库,MinGW将能够链接到它(我正在使用Code::Blocks处理此过程的MinGW端)。
为了避免名称混淆问题,库接口在extern "C"块中声明,并仅使用C和C ++通用的数据类型。尽管采取了这些预防措施,但MinGW在尝试编译连接到库的项目时会出现未定义的引用错误。
该库文件是在VS 2012中从两个文件LibTest.h和LibTest.cpp编译的(这些是展示问题的简化示例)。
// LibTest.h

#ifndef LIBTEST_H
#define LIBTEST_H

extern "C" {

int Test(int input);

}

#endif

// LibTest.cpp

#include "LibTest.h"

extern "C" {

int Test(int input){
    return (input + 5);
}

}

VS 2012将其编译为静态库(LibTest.lib),没有任何投诉。我的MinGW测试程序如下:

// LibTest.lib is linked in the project settings
#include "LibTest.h" // Same LibTest.h as above

int main(){

    int x = 5;
    int a = Test(x);

    return 0;
}

当我尝试编译这个库时,进程失败并显示了一个未定义的引用错误(与尝试链接名称混淆的库生成的相同错误)。我期望使用 extern "C" 可以防止名称混淆问题,但由于这是我第一次尝试创建跨编译器兼容的库,我可能错过了其他内容。非常感谢任何建议或评论!

为什么不发布精确的错误信息,这样每个人都可以看到MinGW正在寻找的确切名称?同时,发布dumpbin /symbols LibTest.lib的输出内容可能会很有教育意义,因为我们可以看到MSVC创建的库中有哪些名称。 - Michael Burr
MinGW 给出的确切错误是:obj\Release\main.o:main.cpp (.text+0x16): undefined reference to Testdumpbin /symbols 的输出只是“文件类型:库”。有趣的是,当在 LibTest.lib 上运行 reimp 时也没有产生任何输出。 - Reign of Error
似乎VS 2012生成的库存在某种无效的问题。当尝试从另一个VS 2012项目链接到该库(已删除extern "C"块以防止它们引起问题)时,构建失败并显示“error LNK2001: unresolved external symbol "int __cdecl Test(int)" (?Test@@YAHH@Z)”错误。我不确定库有什么问题;我创建它的过程与此处详细描述的过程相匹配。 - Reign of Error
1
如果你在命令行中构建库:cl /c libtest.cpp && lib libtest.obj,会发生什么? - Michael Burr
从命令行构建它可以工作,无论是一般情况还是特别用于创建与MinGW兼容的库。显然我的VS 2012项目设置有些问题。当链接库时,MinGW会产生警告“Warning: .drectve /DEFAULTLIB:“LIBCMT”/DEFAULTLIB:“OLDNAMES”未被识别”,但生成的程序可以工作。感谢您的帮助,@MichaelBurr! - Reign of Error
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接