c – 与Visual Studio库链接的Cygwin GCC

我使用Visual Studio 2012 Express创建了一个简单的库(静态64位 – .lib).

所有这个库都有一个功能:

int get_number()
{ 
    return 67; 
}

假设生成的lib名为NumTestLib64.lib.

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

#include <stdio.h>   

int get_number();

int main()
{
    printf("get_number: %d\n", get_number());
    return 0;
}

很简单吧?显然不是.
使用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

并且,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

我正在寻找能够在Visual Studio方面和Cygwin命令行方面提供指令的勇敢者,以了解如何完成这项工作.

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

请帮忙!

最佳答案 找到答案了!关键是创建* .dll和* .lib文件.

实际导出符号时会创建* .lib.

下面是创建的DLL的头文件(在Visual Studio中创建DLL时,onlty工作,创建静态库不起作用):

#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

当然,TESTLIB_EXPORTS仅在DLL项目中定义.
由于__declspec(dllimport)部分,链接到此DLL的main将使用此标头非常重要.此外,正如评论员所建议的那样,外部“C”是必须的,以避免损坏.
此外,我已成功连接Cygwin32和MinGW32,而不是Cygwin64.

点赞