Qt Creator怎样添加库文件

VR_Lab 2010-08-16 11:27:08
我现在在用Creator做个网络方面的测试程序,里面用到UDPSocket,在解析数据时需要用到ntohl这些函数,自然要包括winsock2.h、ws2tcpip.h这些头文件,但编译时出现undefined reference to ntohl@4的问题,这个一看一般是没有连接到库的问题,我就在程序中添加了#pragma comment(lib,"Ws2_32.lib")但又出现ignoring pragma comment的问题,我想问一下Qt在哪里可以像VS一样的直接添加lib文件呢?为什么出现ignoring pragma comment呢?期待高人
...全文
4315 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
小瓜 2011-09-26
  • 打赏
  • 举报
回复
顶下,先学着
thyman 2011-08-15
  • 打赏
  • 举报
回复
1. ws2_32.lib 是MSVC的导入库,MinGW中的是 libws2_32.a

2. #pragma comment(lib,...) 是 MSVC 专有的,MinGW 没有类似写法

3. 在pro文件内 加入 LIBS += -lws2_32 即可,无论你用的 MSVC 还是 MinGW

4. 在Qt中, ws2_32 应该是默认会被链接上的,qmake能自动处理这些情况,所以你可能根本就不需要做什么
风声边界 2011-02-15
  • 打赏
  • 举报
回复
ignoring pragma comment
这句有最终解释和解决办法吗?
VR_Lab 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 darkdong 的回复:]
在理想的世界里,网络字节顺序一定是big endian的,不过现在流行的桌面系统基本上都是little endian,如果按照标准则每次收发数据都要做相应的转换,比较麻烦,所以很多情况下都直接上little以提高效率。这个没办法自己判断,双方必须事先约定,默认的约定是big endian。实在不知道就猜,多试几个数很容易猜出来
[/Quote]
恩,我也查出来网络上的是big了。感谢各位的指点。
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
winsock里面的ntohl好像就没管数据源始big还是little,直接转化为自己CPU能正确用的数据。
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tingsking18 的回复:]
mingw32中没有#pragma comment(lib,"Ws2_32.lib")这样的预处理命令。
[/Quote]
mingw和msvc是怎样确定的呢?这个不懂!这两个可以相互调换吗?我直接从套接字中得到的数据我应该FromBigEndian还是Little呢?
tingsking18 2010-08-16
  • 打赏
  • 举报
回复
mingw32中没有#pragma comment(lib,"Ws2_32.lib")这样的预处理命令。
luoyuan986727 2010-08-16
  • 打赏
  • 举报
回复
楼上的方法不错,我也试了的
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tingsking18 的回复:]
QtEndian可以转换
T qFromBigEndian ( const uchar * src )
T qFromBigEndian ( T src )
T qFromLittleEndian ( const uchar * src )
T qFromLittleEndian ( T src )
void qToBigEndian ( T src, uchar * dest )
T……
[/Quote]
恩,这个很有用!
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tingsking18 的回复:]
你编译器用的什么?mingw还是msvc?
如果是msvc
#pragma comment(lib,"Ws2_32.lib")
是没有错的。
如果是mingw就要
在pro文件中加入:
LIBS+= Ws2_32.lib
[/Quote]
是mingw32,但好像没有ws2_32.lib这个文件
tingsking18 2010-08-16
  • 打赏
  • 举报
回复
QtEndian可以转换
T qFromBigEndian ( const uchar * src )
T qFromBigEndian ( T src )
T qFromLittleEndian ( const uchar * src )
T qFromLittleEndian ( T src )
void qToBigEndian ( T src, uchar * dest )
T qToBigEndian ( T src )
void qToLittleEndian ( T src, uchar * dest )
T qToLittleEndian ( T src )

[Quote=引用 2 楼 kingbyang1 的回复:]

引用 1 楼 supervila 的回复:
编辑.pro文件,加上LIBS += Ws2_32.lib试试。

话说QT有自己的socket函数,为什么不用呢?

我就在用Qt自己的socket,感觉比较方便,但是我需要ntohl这类的函数,Qt中有自己的这类函数吗?
[/Quote]
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supervila 的回复:]
编辑.pro文件,加上LIBS += Ws2_32.lib试试。

话说QT有自己的socket函数,为什么不用呢?
[/Quote]
我就在用Qt自己的socket,感觉比较方便,但是我需要ntohl这类的函数,Qt中有自己的这类函数吗?
tingsking18 2010-08-16
  • 打赏
  • 举报
回复
你编译器用的什么?mingw还是msvc?
如果是msvc
#pragma comment(lib,"Ws2_32.lib")
是没有错的。
如果是mingw就要
在pro文件中加入:
LIBS+= Ws2_32.lib
supervila 2010-08-16
  • 打赏
  • 举报
回复
编辑.pro文件,加上LIBS += Ws2_32.lib试试。

话说QT有自己的socket函数,为什么不用呢?
巴依老爷 2010-08-16
  • 打赏
  • 举报
回复
在理想的世界里,网络字节顺序一定是big endian的,不过现在流行的桌面系统基本上都是little endian,如果按照标准则每次收发数据都要做相应的转换,比较麻烦,所以很多情况下都直接上little以提高效率。这个没办法自己判断,双方必须事先约定,默认的约定是big endian。实在不知道就猜,多试几个数很容易猜出来
VR_Lab 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tingsking18 的回复:]
C/C++ code

int checkCPUendian()
{
union{
unsigned long int i;
unsigned char s[4];
}c;

c.i = 0x12345678;
return (0x12 == c.s[0]);
}……
[/Quote]
不是这个意思,我知道怎样判断自己的CPU是big还是Little,X86的架构的都是little,我想知道的是从网络传过来的数据是big还是little,因为只需qFromBig或者是qFromLittle就可以将网络上的数据转化而不需要知道自己的CPU是B或者是L,这两个函数应该是先判断了自己CPU是什么才做的swap.
tingsking18 2010-08-16
  • 打赏
  • 举报
回复

int checkCPUendian()
{
union{
unsigned long int i;
unsigned char s[4];
}c;

c.i = 0x12345678;
return (0x12 == c.s[0]);
}
tingsking18 2010-08-16
  • 打赏
  • 举报
回复
自己判断一下是高字节在前还是低字节在前。
[Quote=引用 9 楼 kingbyang1 的回复:]

引用 8 楼 tingsking18 的回复:
mingw32中没有#pragma comment(lib,"Ws2_32.lib")这样的预处理命令。

mingw和msvc是怎样确定的呢?这个不懂!这两个可以相互调换吗?我直接从套接字中得到的数据我应该FromBigEndian还是Little呢?
[/Quote]

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧