Visuals studio 2005项目属性配置要点


    要编程开发产品,除了对编程语言的运用外,还需要一个协助你编程的环境。现代的开发工具功能异常强大,方便地重构,代码自动补全,各种调试神器,让你做起事来事半功倍。我是用Visual studio 2005来做开发的,今天猛地发现,原来对这个环境还有很多东西值得我们去探究。


Debug 和 Release的区别

    Debug顾名思义就是调试版,生成的程序没有经过优化并且包含跟踪需要的调试信息,在程序运行时,可以设置断点,查看断点发生时,所有变量的值。加上Visual stdio IDE配套的各种调试神器,Call Stacks,Memory, Watch等等,再配上断点设置策略(数据断点,函数断点), 为程序查BUG提供了强大的支持。

    Release版就是发布版,通常不加入任何调试信息,可执行文件比调试版的要小得多,并且优化为速度最快。

    右键项目Properties,-> Configuration Properties-> C/C++ -> General下,有个Debug Information Format选项。Debug版的一般选择Program Database (/Zi),生成记录调试信息的.pdb文件,Release版的一般选择为Disabled.

    右键项目Properties -> Configuration Properties -> C/C++ ->Optimization 下,有个Optimization选项,Debug版的一般选择 Disabled, Release版的一般选择Maximize Speed (/O2)优化为最快速度。

    右键项目 Properties -> Configuration Properties -> Linker ->Debugging 下,Generate Debug Info 选项,Debug版的一般选择Yes (/DEBUG) , Release版的一般选择No。

 

MDd,MD,MTd,MT的区别

    在Visual studio开发环境中 ,右键项目Properties ->Configuration Properties -> C/C++ -> Code Generation下,有个Runtime Library选项。

分别是

Multi-threaded Debug DLL (/MDd)

 

Multi-threaded DLL (/MD)

 

Multi-threaded Debug (/MTd)

 

Multi-threaded (/MT)

 

MD 指的是 Multi-threaded DLL,使用多线程的动态库版本的运行库。

MT指的是 Multi-threaded ,使用多线程的非动态库版本(静态链接的版本)运行库。

MD 或MT后加上个d,表示调试版(Debug),无论你使用动态库版本的还是静态链接版本的运行库,如果你在调试程序的话,就得选用带d的。因为带d的才有调试信息,在调试的时候才能跟踪进去。

 

在一个工程里面,运行库只能选择使用其中一种,如果既选择了动态库版本(链接MSVCRT.lib.,运行时需要MSVCRT.dll),又选择静态库版本(链接LIBCMT.lib)的话,运行库就会被重复定义,编译的时候就会出错。所以一个工程,包括它所依赖的静态库工程,都得统一运行库的版本。要么都使用MT,要么都使用MD。

因为MFC也会用到运行库,所以如果使用了MFC的类的话,MFC的运行库也是要和工程的统一起来,在右键项目Properties ->Configuration Properties -> General下的Use of MFC选项,如果使用动态库版本的运行库,那就得选择Use MFC in a Shared DLL,如果使用静态链接的的运行库,那就选择UseMFC in a Static Library。如果没有用到MFC的话,那么选择Use Standard Windows Libraries就可以了。

 

一个工程使用MT或者MTd静态链接的运行库时也会有可能出现编译错误,说某些函数重复定义。如下:

uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecloperator new(unsigned int)" (??2@YAPAXI@Z) already defined inLIBCMTD.lib(new.obj)

 

如果遇到uafxcwd.lib(调试版的带d)或者msvcrtd.lib(调试版的带d)的某某函数已经在libcmtd.lib(调试版的带d)里定义的编译错误,那是因为CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

    只要右键项目Properties -> Configuration Properties -> Linker -> Input下的 Ignore Specified Library选项填上 uafxcwd.liblibcmtd.lib , 把这两个库都忽略,然后在Linker->Input 下的Additional Dependencies加上 uafxcwd.liblibcmtd.lib(先链接MFC的,再链接CRT),即可解决。

 

 

解决方案的配置

在Visual studio 2005在工具栏中有一个设置Solution Configuration的下拉框,设置当前的解决方案的配置,默认有Debug,和Release两种选择。上面提到有MT,MD两大类别,所以我们可以在里面添加MD_Debug,MD_Release,MT_Debug,MT_Release等,每当我们选定一个配置的时候,Configuration Manager会列出当前解决方案下的所有工程对应当前配置的配置。如下图。

 

我们可以点击对应工程的Configuration的下拉框,设置当前MT_Debug配置下,该工程对应的配置名称,每个工程默认也是只有Debug和Release的,如果需要增加,也可以对每一个工程进行配置。

       当这些都配置好以后,我们就可以非常方便地切换到不同的版本去生成程序。


<think>好的,用户想用Visual Studio编写一个C++的局域网聊天系统。我需要一步步引导他们完成这个过程。首先,得考虑用户可能的技能水平。他们可能已经熟悉C++基础,但网络编程可能是新领域。需要从项目结构开始,确保他们正确设置开发环境。 接下来,选择网络库是关键。C++常用的有Boost.Asio和POCO,或者原生Socket。考虑到用户可能希望简化,Boost.Asio虽然功能强大,但需要额外安装,而原生Socket可能在Windows上更直接。不过Boost.Asio的异步模型更适合聊天应用,所以可能需要推荐它,但也要提到其他选项。 然后,确定通信协议。TCP和UDP之间的选择,TCP可靠,适合聊天,UDP可能更快但不可靠。这里应该建议TCP,确保消息正确传输。 项目结构部分,需要分服务器和客户端。服务器处理多个客户端连接,客户端连接服务器并交换消息。代码示例需要简单明了,但也要注意线程和多路复用,比如select或异步IO,避免阻塞。 示例代码部分,需要提供服务器和客户端的基本框架。服务器端可能需要使用多线程处理每个客户端,而客户端则需要输入和接收消息的线程。注意Windows和Linux的区别,用户用VS,所以用Windows的Socket库,比如Winsock,并提醒初始化WSAStartup。 此外,需要提到常见问题,比如防火墙设置,端口开放,IP地址的正确获取。可能用户会遇到连接失败,需要检查这些方面。 测试步骤也很重要,指导用户如何运行服务器和客户端,可能在本地先测试,再尝试同一局域网的不同机器。 最后,扩展功能部分,可以建议添加GUI,消息加密,或者文件传输,但保持基础部分的完整。确保用户能够分步实现,不被复杂功能吓到。 需要检查代码是否正确,特别是Winsock的使用和错误处理。确保示例代码没有遗漏关键步骤,比如关闭Socket,释放资源。同时,提醒用户编译时的链接选项,比如-lws2_32。 可能用户对网络编程概念不熟悉,所以适当解释一些术语,如端口、IP、TCP连接。但保持简洁,重点在实现步骤。确保回答结构清晰,逐步引导,避免信息过载。</think>当然可以!以下是为您设计的分步实现方案: 一、准备环境 1. 安装Visual Studio 2022+(社区版免费) 2. 创建新项目:选择"Windows控制台应用程序" 3. 配置项目属性: - 链接器 -> 输入 -> 附加依赖项添加`ws2_32.lib` - C++语言标准选择C++17或更高 二、网络架构设计 ``` [客户端A] <--TCP连接--> [服务器] <--TCP连接--> [客户端B] (局域网IP) ``` 三、核心代码实现 1. 服务器端代码框架(Server.cpp): ```cpp $$#include <WinSock2.h> #include <iostream> #include <vector> #pragma comment(lib, "ws2_32.lib")$$ ``` 2. 初始化Winsock: ```cpp WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "WSAStartup失败" << std::endl; return 1; } ``` 3. 创建服务器Socket: ```cpp SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8888); serverAddr.sin_addr.s_addr = INADDR_ANY; bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)); listen(serverSocket, 5); ``` 四、客户端实现要点 1. 连接服务器: ```cpp SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8888); inet_pton(AF_INET, "192.168.1.100", &serverAddr.sin_addr); // 服务器IP connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)); ``` 五、消息处理逻辑 1. 接收线程: ```cpp char buffer[1024]; while (true) { int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0); if (bytesReceived > 0) { std::cout << "\n收到消息: " << std::string(buffer, 0, bytesReceived) << std::endl; } } ``` 六、运行测试 1. 服务器启动步骤: - 编译运行Server.cpp - 输入`netstat -ano | find "8888"`验证监听状态 2. 客户端连接测试: - 至少运行两个客户端实例 - 使用`telnet 127.0.0.1 8888`进行基础测试 七、常见问题解决方案 1. 连接失败检查: - 确认防火墙开放8888端口 - 确保服务器和客户端在同一局域网段 - 使用`ipconfig`获取正确IP地址 2. 消息传输异常处理: - 添加包头/包尾标识 - 实现消息长度前缀 - 设置接收超时时间 八、扩展功能建议 1. 添加图形界面(建议使用Qt) 2. 实现消息加密(AES算法) 3. 增加文件传输功能 4. 添加用户认证系统 完整示例代码可通过以下方式获取: 1. GitHub开源项目:搜索"CPPChatSystem" 2. Microsoft Docs官方Socket示例 3. Boost.Asio高级实现方案 需要具体实现某个模块时,可以告知我您需要详细解释的部分。建议先从基础版本开始开发,逐步添加功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值