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"来防止名称修改问题,但由于这是我第一次尝试创建与交叉编译器兼容的库,因此我可能错过了其他一些东西。

任何建议或意见将不胜感激!

4

1 回答 1

0

我想说微软编译器需要 __declspec(dllexport) !

这是一个msdn链接:

https://msdn.microsoft.com/en-US/en-en/library/a90k134d.aspx

于 2017-05-23T08:55:21.690 回答