C++学习笔记(37)

302、makefile
在实际开发中,项目的源代码文件比较多,按类型、功能、模块分别存放在不同的目录和文件中,哪
些文件需要先编译,那些文件后编译,那些文件需要重新编译,还有更多更复杂的操作。
make 是一个强大的实用工具,用于管理项目的编译和链接。make 需要一个编译规则文件 makefile,
可实现自动化编译。 一、app/demo01.cpp
#include "public.h" // 包含通用函数和类的头文件。
#include "myapi.h" // 包含另一个通用函数和类的头文件。
using namespace std;
int main()
{
func(); // 调用通用的函数。
func1(); // 调用另一个通用的函数。
AA a; // 用通用类声明对象。
a.show(); // 调用对象的方法。
BB b; // 用另一个通用类声明对象。
b.show(); // 调用对象的方法。
}
二、app/makefile
INCLUDEDIR=-I/home/wucz/tools -I/home/wucz/api
LIBDIR=-L/home/wucz/tools -L/home/wucz/api
all:demo01 demo02 demo03
demo01:demo01.cpp
g++ -o demo01 demo01.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi
cp demo01 /tmp/. demo02:demo02.cpp
g++ -o demo02 demo02.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi
demo03:demo03.cpp
g++ -o demo03 demo03.cpp $(INCLUDEDIR) $(LIBDIR) -lpublic -lmyapi
clean:
rm -f demo01 demo02 demo03
三、tools/public.h
// 通用函数和类的头文件。
#include <iostream>
// 声明一个通用的函数。
void func();
// 声明一个通用的类。
class AA
{
public:
void show();
};
四、tools/public.cpp
// 通用函数和类的代码实现文件。
#include "public.h" using namespace std;
// 通用函数的代码实现。
void func()
{
cout << "升级了调用了 func()函数。\n";
}
// 通用类的代码实现。
void AA::show()
{
cout << "升级了我是一只傻傻鸟。\n";
}
五、tools/makefile
# 指定编译的目标文件是 libpublic.a 和 libpublic.so
all:libpublic.a \
libpublic.so
# 编译 libpublic.a 需要依赖 public.h 和 public.cpp
# 如果被依赖文件内容发生了变化,将重新编译 libpublic.a
libpublic.a:public.h public.cpp
g++ -c -o libpublic.a public.cpp
libpublic.so:public.h public.cpp
g++ -fPIC -shared -o libpublic.so public.cpp
# clean 用于清理编译目标文件,仅在 make clean 才会执行。
clean:
rm -f libpublic.a libpublic.so
六、api/myapi.h
// 另一个通用函数和类的头文件。
#include <iostream>
// 声明一个通用的函数。
void func1();
// 声明一个通用的类。
class BB
{
public:
void show();
};
七、api/myapi.cpp
// 另一个通用函数和类的代码实现文件。
#include "myapi.h" using namespace std;
// 通用函数的代码实现。
void func1()
{
cout << "调用了 func1()函数。\n";
}
// 通用类的代码实现。
void BB::show()
{
cout << "你是一只傻傻鸟。\n";
}
八、api/makefile
# 指定编译的目标文件是 libmyapi.a 和 libmyapi.so
all:libmyapi.a libmyapi.so
# 编译 libmyapi.a 需要依赖 myapi.h 和 myapi.cpp
# 如果被依赖文件内容发生了变化,将重新编译 libmyapi.a
libmyapi.a:myapi.h myapi.cpp
g++ -c -o libmyapi.a myapi.cpp
libmyapi.so:myapi.h myapi.cpp
g++ -fPIC -shared -o libmyapi.so myapi.cpp
# clean 用于清理编译目标文件,仅在 make clean 才会执行。
clean:
rm -f libmyapi.a libmyapi.so
303、main 函数的参数
一、main 函数的参数
main 函数有三个参数,argc、argv 和 envp,它的标准写法如下:
int main(int argc,char *argv[],char *envp[])
{
return 0;
}
argc 存放了程序参数的个数,包括程序本身。
argv 字符串的数组,存放了每个参数的值,包括程序本身。
envp 字符串的数组,存放了环境变量,数组的最后一个元素是空。
在程序中,如果不关心 main()函数的参数,可以省略不写。 二、操作环境变量
1)设置环境变量
int setenv(const char *name, const char *value, int overwrite);
name 环境变量名。
value 环境变量的值。
overwrite 0-如果环境不存在,增加新的环境变量,如果环境变量已存在,不替换其值;非 0-如果
环境不存在,增加新的环境变量,如果环境变量已存在,替换其值。
返回值:0-成功;-1-失败(失败的情况极少见)。
注意:此函数设置的环境变量只对本进程有效,不会影响 shell 的环境变量。如果在运行程序时执行
了 setenv()函数,进程终止后再次运行该程序,上次的设置是无效的。
2)获取环境变量的值
char *getenv(const char *name);
三、示例
#include <iostream>
using namespace std;
int main(int argc,char *argv[],char *envp[])
{
if (argc!=4)
{
cout << "表白神器程序的使用方法:./demo 追求者姓名 被追求者姓名 表白内容\n";
return -1;
}
cout << argv[1] << "开始向" << argv[2] << "表白。\n";
cout << argv[3] << endl;
cout << argv[1] << "表白完成。\n";
return 0;
cout << "一共有" << argc << "个参数。\n";
// 显示全部的参数。
for (int ii=0;ii<argc;ii++)
{
cout << "第" << ii << "个参数:" << argv[ii] << endl;
}
// 显示全部的环境变量。
for (int ii=0;envp[ii]!=0;ii++) // 环境变量数组最后一个元素是 0。
{
cout << envp[ii] << endl;
}
// 设置环境变量 AA。
setenv("AA","aaaa",0);
// 显示环境变量 AA 的值。
cout << "AA=" << getenv("AA") << endl;
return 0;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql性能优化- 数据库配置优化

MySQL 性能优化 - 数据库配置优化 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;但随着数据量的增长和访问频率的提高&#xff0c;其性能可能会成为瓶颈。为了保持高效的性能&#xff0c;除了应用层的查询优化和索引优化之外&#xff0c;数据库配置优化 也是非常重…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

爵士编曲:爵士鼓编写 爵士鼓笔记 底鼓和军鼓 闭镲和开镲 嗵鼓

底鼓和军鼓 底鼓通常是动的音色&#xff0c;军鼓通常是大的音色。 “动”和“大”构成基础节奏。“动大”听着不够有连接性&#xff0c;所以可以加入镲片&#xff01; 开镲 直接鼓棒敲击是开镲音色 闭镲 当脚踩下踏板&#xff0c;2个镲片合并&#xff0c;然后用鼓棒敲击&am…

C++ Linux IPC进程通信-消息队列MQ

原文链接&#xff1a;C Linux IPC进程通信-消息队列MQ 消息队列库<sys/msg.h> 相比于共享内存和管道,消息队列能够实现指定的消息格式和排序,能实现更复杂的通信 库函数 // 创建消息队列 int msgget(key_t, key, int msgflg); return ID(成功) -1(错误)key为一个标记…

java(3)数组的定义与使用

目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…

面向对象程序设计——set容器の简析

1.set的介绍 • 序列式容器和关联式容器 • 我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧…

图片马赛克处理(Java)

1.需求 给图片的指定区域打码给整张图片打码马赛克方格取色支持中心点取色和随机取色马赛克支持灰度处理 2.源码 package com.visy.utils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOE…

screen使用——关机时在服务器上跑代码

一、连接服务器 原理:通过 SSH(Secure Shell)协议建立本地与远程服务器的安全连接通道,使得可以在本地操作服务器。 操作:使用 VSCode 或 cmd 的 ssh 连接到服务器,这里我选择cmd。 检查是否安装 OpenSSH 在 Windows 10 及以上版本中,系统可能已经自带 OpenSSH 客户端…

(k8s)Kubernetes部署Promehteus

转载&#xff1a;Kubernetes&#xff08;k8s&#xff09;部署Promehteus 一、概述 在1.8版本以后heapster由metrics-server替代&#xff1b;从k8s的v1.11版本开始已经全面转向以Prometheus为核心的新监控体系架构&#xff1b;kube-prometheus 中包含了 prometheus 监控所用到的…

Kubernetes(K8S)实战:构建高可用的微服务架构

Kubernetes(K8S)实战:构建高可用的微服务架构 在云计算与容器化技术日新月异的今天,Kubernetes(简称K8S)凭借其强大的容器编排能力,已成为企业构建云原生应用的首选平台。本文将深入探讨Kubernetes的核心概念、架构设计原则,并通过一个实际案例——构建一个高可用的微…

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

算法:双指针题目练习

文章目录 算法:双指针移动零复写零快乐数盛最多水的容器有效三角形的个数查找总价格为目标值的两个商品三数之和四数之和 总结 算法:双指针 移动零 定义两个指针,slow和fast.用这两个指针把整个数组分成三块. [0,slow]为非零元素,[slow1,fast-1]为0元素,[fast,num.length]为未…

数据库面试题整理

数据库面试题整理 整理了下常见的有关数据的面试题&#xff0c;持续更新中 1. mysql数据库事务的四个特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务要么做&#xff0c;要么不做一致性&#xff08;Consistency&#xff09;&#xff1a;使数据库从…

Nginx泛域名 解析的匹配前缀绑定或转发到子目录

网站的目录结构为&#xff1a; # tree /home/wwwroot/landui.com /home/wwwroot/landui.com ├── bbs │ └── index.html └── www └── index.html 2 directories, 2 files /home/wwwroot/landui.com为nginx的安装目录下默认的存放源代码的路径。 bbs为论坛…

GPU使用

0. 写这篇文章的背景 最近还是在使用GPU、连接远程服务器上出现了一点问题,发现在这方面的知识还是学得很模糊。(最让人感到困惑的是之前GPU的使用都没有问题) 总结一下最近的问题: 1.每一次连接远程服务器(选择的Ubuntu22.04),使用服务器的文件夹还好(关键是现在用…

YARN性能优化高频面试题及答案

目录 高频面试题及答案1. 什么是YARN?它在Hadoop生态系统中的作用是什么?2. 如何通过合理配置`Container`大小来优化YARN性能?3. 如何通过调整`ResourceManager`的调度策略优化YARN性能?4. 如何优化YARN中`ResourceManager`和`NodeManager`的内存配置?5. 如何通过调节`Map…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍&#x1f60b; input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…

基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真&#xff0c;对比网络通信开销&#xff0c;存活节点数量&#xff0c;网络能耗以及数据通信量四个指标…

Unity射击游戏开发教程:(36)敌人关卡生成器的设计和开发

丰富多样地游戏关卡生成器能自动生成不同的关卡地图和游戏内容,以增加游戏的可玩性和挑战性。关卡生成可以基于随机算法或者预设的规则生成不同的地图布局、敌人位置、道具位置等。 定义关卡生成器WaveSpawner 如何设置通用的 Wave Spawner?我将此 Wave Spawner 脚本附加到…

QT 中中文乱码的问题处理

在使用 QT 开发应用程序时&#xff0c;可能会遇到中文乱码的问题&#xff0c;这是因为 QT 使用的编码方式和系统的编码方式不一致导致的。下面是 QT 中中文乱码的问题处理的方法&#xff1a; 设置编码方式 第一步&#xff1a;在 QT 中&#xff0c;可以使用 QTextCodec 对象来设…