忽略#pragma 注释 ws2_32.lib [-Wunknown-pragmas]

ignoring #pragma comment ws2_32.lib [-Wunknown-pragmas]

我正在尝试使用 Qt 创建程序编译一些 C++ 代码,该代码必须连接到用于发送和接收数据的套接字。我已经链接了库文件,添加了标志 win32: LIBS+= -lWS2_32。附上下面的代码片段:

...
#include<winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include<windows.h>
...
WSADATA wsa;
SOCKET s;
uint8_t* encode_buffer;
uint8_t* decode_buffer;
uint16_t encode_buffer_length;
uint16_t decode_buffer_length;
if (send(s, encode_buffer, encode_buffer_length,0)<0){
    ...
}
if((recv_size=recv(s, decode_buffer, decode_buffer_length,0))== SOCKET_ERROR){
    ...
}

我的以下问题是:

Warning: ignoring #pragma comment [-Wunknown-pragma]
Error: invalid conversion from 'uint8_t* {aka unsigned char*} to 'const char*'[-fpermissive]
Error: invalid conversion from 'uint8_t* {aka unsigned char*} to 'char*'[-fpermissive]
Error: no matching function for call to 'send'
Error: no matching function for call to 'recv'
Warning: unknown pragma ignored

我已将 ws2_32.lib 文件作为外部库添加到项目中,并在 #pragma 指令中提及它。

不确定我哪里出错了。

编辑:谢谢! Reinterpret_cast 解决了问题

关于 警告 (不是错误),大多数编译器不支持您使用的 #pragma(Microsoft 和 Embarcadero 编译器支持)。所以完全删除它(你已经 link 到项目 makefile 中的库),或者至少用适当的 #if/def.

禁用它

至于其余的 错误 send()recv() 需要 char* 指针,而不是 uint8* 指针。一个简单的 type-cast 就足够了。

试试这个:

...
#if defined(_MSC_VER) || defined(__BORLANDC__)
#pragma comment(lib,"Ws2_32.lib")
#endif
...
if (send(s, reinterpret_cast<char*>(encode buffer), encode_buffer_length, 0) < 0) {
    ...
}
if ((recv_size = recv(s, reinterpret_cast<char*>(decode buffer), decode_buffer_length, 0)) == SOCKET_ERROR) {
    ...
}
...