Cygwin GCC 与 Visual Studio 库链接

mad*_*at1 5 c++ gcc cygwin static-libraries visual-studio-2012

我使用 Visual Studio 2012 Express 创建了一个简单的库(静态 64 位 - .lib)。这个库只有一个功能:

int get_number()
{ 
    return 67; 
}
Run Code Online (Sandbox Code Playgroud)

假设生成的 lib 被称为NumTestLib64.lib.

我正在尝试test.cpp使用 Cygwin64编译一个简单的程序(让我们称之为),它将链接NumTestLib64.lib并打印以下结果get_number()

#include <stdio.h>   

int get_number();

int main()
{
    printf("get_number: %d\n", get_number());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

很简单吧?显然不是。
编译g++ -o test test.cpp -L. -lTestLibStatic64返回:

/tmp/ccT57qc6.o:test.cpp:(.text+0xe): undefined reference to `get_number()'
/tmp/ccT57qc6.o:test.cpp:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `get_number()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

并且,g++ -o test test.cpp TestLibStatic64.lib返回:

/tmp/ccMY8yNi.o:test.cpp:(.text+0xe): undefined reference to `get_number()'
/tmp/ccMY8yNi.o:test.cpp:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `get_number()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我正在寻找勇敢的人,他们可以在 Visual Studio 端和 Cygwin 命令行端提供有关如何完成这件事的说明。

我已经尝试了所有可能的网页,所以链接可能无济于事,只是确切的说明。我不介意将库更改为 DLL 或执行任何必要的更改,所有代码都是我的,无论是在这个简单的示例中还是在我正在开发的实际应用程序中。

请帮忙!

mad*_*at1 2

找到答案了!关键是创建 *.dll 和 *.lib 文件。*.lib 是在实际导出符号时创建的。下面是创建的DLL的头文件(只有在Visual Studio中创建DLL时才有效,创建静态库还不能工作):

#ifdef TESTLIB_EXPORTS
#define TESTLIB_API __declspec(dllexport)
#else
#define TESTLIB_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
#endif

TESTLIB_API int get_num();

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

当然,TESTLIB_EXPORTS只是在DLL项目中定义。由于该__declspec(dllimport)部分,链接到该 DLL 的 main 将使用该标头,这一点很重要。此外,extern "C"正如评论员所建议的那样,为了避免损坏,这是必须的。另外,我在 Cygwin32 和 MinGW32 上成功链接,但在 Cygwin64 上链接失败。