1. 安装c++
在 CentOS7 上,可以使用 yum 包管理器来安装 C++11 的开发工具和库。具体步骤如下:
1.1 更新系统软件包到最新版本:
sudo yum update #更新
1.2 安装 C++11 开发工具和库:
sudo yum install gcc-c++ -y
sudo yum install libstdc++-devel -y
以上命令会安装GNU C++编译器和标准C++库的开发文件,包括头文件和库文件。其中,gcc-c++是C++编译器,libstdc+±devel是标准C++库的开发文件。
1.3 检查安装是否成功:
gcc --version
g++ --version
2. 测试程序
2.1 创建项目目录
在test目录下,创建项目目录secretkey,在该目录下创建src、obj、lib和include分别用来保存.cpp源文件、过程文件.o、生成的动态库文件.so和头文件.h,主函数创建在主目录下。
2.2 创建Makefile编译脚本文件
根据程序文件的名称,创建编译脚本,使用make执行,实现动态库编译
此处避坑,PROJECT=libprint_func.so 后面的名称必须要加上’lib’,否则编译调用函数时,无法找到该动态库文件,即原程序名称为print_func,加上lib生成动态库
#生成的动态库文件名
PROJECT=libprint_func.so
#使用的编译器,如果用c语言则使用gcc
CC=g++
#源文件保存路径,使用通配符wildcard在路径src目录下查找.cpp文件,如果用c语言则为*.c
SOURCES=$(wildcard src/*.cpp)
#patsubst函数用于将文件模式进行替换,$(patsubst 原模式, 目标模式, 文件列表)
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))
.PHONY:clean
CFLAG = -Iinclude -fPIC -shared
LD_FLAG = -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-all
$(PROJECT): $(OBJECTS)
mkdir -p lib
$(CC) -shared -o lib/$@ $(patsubst %.o,obj/%.o,$(notdir $(OBJECTS))) $(LD_FLAG)
@echo "finish $(PROJECT)"
.cpp.o:
@mkdir -p obj
$(CC) -c $< $(CFLAG) -o obj/$(patsubst %.cpp,%.o,$(notdir $<))
clean:
-rm -rf obj lib
$echo "clean up."
2.3 创建程序文件
分别在src中创建.cpp文件,在include中创建.h文件,在secretkey主目录下创建main.cpp文件,并分别敲入c++代码
transfer.cpp
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
//字符数组,用于随机数匹配
unsigned char Number[10] ={
'0','1','2','3','4','5','6','7','8','9'};
unsigned char Letters[52]={
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
//long型转换成字符
bool transferLong2ByteArray(unsigned char* byte, unsigned char length, unsigned long version){
unsigned long temp = version;
for(unsigned char i = 0; i < length; ++i){
unsigned char res = (unsigned char)(temp & 0xff);
byte[i] = res;
temp = temp >> 8;
}
return true;
}
//字符转换成long型
unsigned long transferByteArrayToLong(unsigned char* byte, unsigned char length)
{
unsigned long version = 0;
#if 1
for(unsigned int i = 0; i < length; ++i){
unsigned long temp = byte[i];
version |= (temp << i * 8);
}
#else
long s = 0;
long s0 = (byte[0] & 0xff);
long s1 = (byte[1] & 0xff) << 8;
long s2 = (byte[2] & 0xff) <<