Linux下C++的编程——开发环境搭建与第一个程序

上一篇文章Linux下C++的编程——开偏介绍中我们已经介绍了GUN、GCC、G++等一些重要的概念,现在应该开始动手实践了!

开发工具的安装

环境
Distributions版本:CentOS 6.7
Linux内核片:2.6.32-573.3.1.el6.i686

一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装。

[luowf@luoweifu ~]$ gcc -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
[luowf@luoweifu ~]$ g++ -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 

如果未安装,在Linux系统链接网络的时候可通过以下命令安装开发工具集:

yum groupinstall "Development Tools"

第一个HelloWorld程序

说到程序,第一个肯定就是HelloWorld,那我们也从HelloWorld开始吧,写一个最简单的Hello程序,并编译和运行。

编写第一个程序

[luowf@luoweifu Cplusplus]$ pwd
/home/luowf/workspace/Cplusplus

//在vim中编写第一个HelloWorld程序
[luowf@luoweifu Cplusplus]$ vim HelloWorld.cpp
1 #include <iostream>
2 
3 int main()
4 {
5         std::cout << "Hello Wolrd!" << std::endl;
6         return 0;
7 }

//编译程序
[luowf@luoweifu Cplusplus]$ g++ HelloWorld.cpp 
[luowf@luoweifu Cplusplus]$ ls
a.out  HelloWorld.cpp  test1  test2
[luowf@luoweifu Cplusplus]$ ./a.out 
Hello Wolrd!
[luowf@luoweifu Cplusplus]$

g++与gcc的区别

在上一篇文章中其实已经分别介绍了gcc和g++,说gcc是C的编译器,g++是C++的编译器。那是不是说gcc只能编译编译C语言,而g++只能编译C++呢?其实不是,gcc也可以编译C++程序,而C++是C的基础上发展而来的,所以g++也不可能编译不了C语言。它们之间的区别有如下几点:
1. 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,C++的语法规则更加严谨一些。
2. 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。用gcc进行编译,在选项中加上要链接的库,也可以编译c++。如上面的HelloWorld程序我们也可以用以下的命令进行编译:

[luowf@luoweifu Cplusplus]$ gcc -lstdc++ HelloWorld.cpp
[luowf@luoweifu Cplusplus]$ ls
a.out  HelloWorld.cpp  test1  test2
[luowf@luoweifu Cplusplus]$ ./a.out 
Hello Wolrd!
[luowf@luoweifu Cplusplus]$ 
  1. gcc不会定义__cplusplus宏,而g++会
    这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

参考文章:http://www.linuxsky.org/doc/dev/200804/298.html

程序的编译及常用命令

将源代码编译成目标文件,不进行链接

gcc -c HelloWorld.cpp

在编译的时候,依据操作系统给予优化执行速度

gcc -O HelloWorld.cpp -c

将目标文件链接成二进行(可执行)文件

gcc -o HelloWorld HelloWorld.o -lstdc++

HelloWorld是可执行文件名,HelloWorld.o是目标文件名;如果是.c后缀的C源文件不用加-lstdc++,如果是.cpp后缀的C++源文件,要加-lstdc++。

在进行二进制文件制作时,将链接的函数库与相关的路径填入

(.cpp文件)gcc -lstdc++ HelloWorld.cpp

(.c文件)gcc HelloWorld.c -lm -L /usr/Lib -I /usr/include

说明:
-lm 指的是libm.so或libm.a这个函数库文件;
-L 后面接的路径是刚才上面那个函数库的搜索目录;
-I 后面的是源码内的include文件(也就是包含的math.h头文件)所在的目录;

HelloWorld.cpp代码如下:

  1 #include <iostream>
  2 #include <math.h>
  3 
  4 int main()
  5 {
  6         std::cout << "Hello Wolrd!" << std::endl;
  7         float value = sin (3.14 / 2);
  8         std::cout << "value:" << value << std::endl;
  9         return 0;
 10 }

将编译链接的结果输出成某个特定的文件名

gcc -lstdc++ -o HelloWorld HelloWorld.cpp

helloWorld为输出的文件名

在编译的时候,输出较多的信息说明

gcc -lstdc++ -o HelloWorld HelloWorld.cpp -Wall


  • 32
    点赞
  • 187
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
很高兴能够回答你的问题。以下是一个简单的即时通信系统的C++网络编程示例,基于Linux平台使用socket库进行开发。 客户端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int client_socket = socket(AF_INET, SOCK_STREAM, 0); // 配置服务器地址 sockaddr_in server_address{}; server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 连接服务器 int connect_result = connect(client_socket, (sockaddr *) &server_address, sizeof(server_address)); if (connect_result == -1) { cout << "连接服务器失败!" << endl; return -1; } // 发送消息 char message[1024] = {0}; while (true) { cin.getline(message, sizeof(message)); if (strlen(message) == 0) { continue; } send(client_socket, message, strlen(message), 0); memset(message, 0, sizeof(message)); } // 关闭socket close(client_socket); return 0; } ``` 服务器端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int server_socket = socket(AF_INET, SOCK_STREAM, 0); // 配置服务器地址 sockaddr_in server_address{}; server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 绑定socket和地址 bind(server_socket, (sockaddr *) &server_address, sizeof(server_address)); // 监听客户端连接 listen(server_socket, 10); // 接受客户端连接 sockaddr_in client_address{}; socklen_t client_address_len = sizeof(client_address); int client_socket = accept(server_socket, (sockaddr *) &client_address, &client_address_len); // 接收消息 char message[1024] = {0}; while (true) { int recv_result = recv(client_socket, message, sizeof(message), 0); if (recv_result <= 0) { break; } cout << "收到消息:" << message << endl; memset(message, 0, sizeof(message)); } // 关闭socket close(client_socket); close(server_socket); return 0; } ``` 在上面的代码中,客户端和服务器端都使用了socket库中的函数来完成网络通信。客户端使用`socket`函数创建socket,使用`connect`函数连接服务器,并使用`send`函数发送消息。服务器端使用`socket`函数创建socket,使用`bind`函数将socket与服务器地址绑定,使用`listen`函数监听客户端连接,并使用`accept`函数接受客户端连接,最后使用`recv`函数接收客户端发送的消息。 当然,这只是一个简单的示例。在实际开发中,你需要考虑更多的细节,例如如何处理多个客户端连接、如何处理异常情况等等。 希望这个示例能够帮助你了解LinuxC++ socket网络编程的基本流程和方法。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘(MoChen)

爱打赏的人技术成长更开哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值