分类目录归档:C/C++

静态库、动态库的制作

1、命名规则

  • 静态库:lib+名称.a  —> libSian.a
  • 动态库:lib+名称.so —> libSian.so

2、静态库制作

  • 准备目录:include、lib、src
  • 头文件存放在include中,源文件存放在src中,库文件存放lib中
  • 生成.o文件:在src目录中gcc -c *.c -I ../include 
  • 生成.a文件:ar rcs lib/libCalc.a src/*.o // 将src下的所有.o文件在lib目录下生成.a文件
  • 利用静态库编译源文件:
    • gcc main.c lib/libCalc.a -o main.out -I include
    • gcc main.c -L lib -l Calc -I include // L库目录,l库名称(不带lib前缀)
  • 整体目录结构及生成文件
    • ── include
    • │   └── head.h
    • ├── lib
    • │   └── libCalc.a
    • ├── main.c
    • ├── main.out
    • └── src
    •     ├── sub.c
    •     ├── sub.o
    •     ├── sum.c
    •     └── sum.o
  • nm命令:nm lib/libCalc.a 可查看.a文件的内容,nm main.out同样可以查看

3、静态库的优缺点

  • 优点:
    • 编译时会根据需要以.o为单位包含库中的内容
    • 发布程序时,不需要提供相对应的库(因为已经打包到应用程序中)
    • 加载库时速度快
  • 缺点:
    • 程序体积变大;
    • 库发生变化需要重新编译

4、动态库制作

  • 生成与位置无关的.o文件
    • gcc -fPIC -c *.c -I ../include 
  • 生成动态库.so文件
    • gcc -shared src/*.o -o lib/libCalc.so -I include
  • 使用动态库编译源文件
    • gcc main.c lib/libCalc.so -o main.out -I include // 方式一
    • gcc main.c -L lib -l Calc -o main1.out -I include // 方式二
    • 两种方式都能生成可执行文件,但方式二生成的执行文件在执行时会报错,./main.out: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory
    • 解决动态库无法找到的问题:
      • 使用lld命令查看可执行文件:ldd main1.out
      • 出现该问题的原因是无法通过环境变量找到动态库文件
      • 方法一:将libCalc.so拷贝到/lib下即可解决;(不推荐)
      • 方法二:export LD_LIBRARY_PATH=./lib 临时导入可以解决,当前终端生效;(临时)
      • 方法三:如果需要每次打开时都有效,在~.bashrc文件的末尾行添加上述指令;(重启终端)
      • 方法四:修改/etc/ld.so.conf文件,加入lib的绝对路径,sudo ldconfig -v更新 (建议)

5、动态库优缺点

  • 优点:
    • 动态库更新不需要更新源程序(接口不变情况下)
    • 执行程序体积小,不需要打包到应用程序中
  • 缺点:
    • 发布程序时需要提供给用户
    • 没有打包到应用程序中,执行效率相对慢一点

C++智能指针auto_ptr,简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
 
template <class object>
class sian_ptr {
public:
    object *m_object;
    // 构造函数接收外部传入的堆空间对象
    sian_ptr(object *object) : m_object(object) {}
    // 当前对象被释放时,释放外部推空间内存
    ~sian_ptr() {
        if (m_object == nullptr) return;
        delete m_object;
    }
    // 重载运算符->巧妙地将当前对象“指向”外部对象
    object* operator->() {
    	return m_object;
    }
};
 
class Person {
public:
    int m_age;
    Person() {
        cout << "Person()..." << endl;
    }
    ~Person() {
        cout << "~Person()..." << endl;
    }
};
int main() {
    {
        // 模拟智能指针auto_ptr
        // auto_ptr<Person> p(new Person());
        sian_ptr<Person> p(new Person());
        p->m_age = 12;
    }
        system("pause");
        return 0;
}

输出结果:
Person()…
~Person()…
请按任意键继续. . .

实现数组类Array,函数模板的简单应用

1、Array.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#pragma once
#include <iostream>
using namespace std;
 
template <typename Item>
class Array {
	int m_size;		// 实际长度
	int m_capacity;	// 容量大小
	Item *m_data;	// 数据结构指针
public:
	Array(int capacity = 0);
	bool insert(Item item);
	Item getItem(int index);
	Item operator[](int index);
	void display();
	~Array();
	friend ostream &operator<<<>(ostream &, Array<Item> &);
};
 
template <typename Item>
Array<Item>::~Array() {
	delete[] m_data;
}
 
template <typename Item>
Array<Item>::Array(int capacity) {
	if (capacity <= 0) return;
	m_capacity = capacity;
	m_data = new Item[capacity];
}
 
template <typename Item>
bool Array<Item>::insert(Item item) {
	if (m_size < m_capacity) {
		m_data[m_size] = item;
		m_size++;
		return true;
	}
	else {
		cout << "数组已满..." << endl;
		return false;
	}
}
 
template <typename Item>
Item Array<Item>::getItem(int index) {
	if (index < 0 || index >= m_size) {
		cout << "传入的索引不合法" << endl;
		return NULL;
	}
	else {
		return m_data[index];
	}
}
 
template <typename Item>
Item Array<Item>::operator[](int index) {
	return getItem(index);
}
 
template <typename Item>
void Array<Item>::display() {
	cout << "[";
	for (int i = 0; i < m_size; i++) {
		cout << m_data[i];
		if (i < m_size - 1) cout << ", ";
	}
	cout << "]";
}
 
template <typename Item>
ostream &operator<<<>(ostream &cout, Array<Item> &arr) {
	arr.display();
	return cout;
}

2、main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "Array.hpp"
using namespace std;
 
 
 
int main() {
	Array<int> arr(4);
	arr.insert(3);
	arr.insert(5);
	arr.insert(6);
	arr.insert(9);
	cout << arr << endl;
	system("pause");
	return 0;
}

3、执行结果:

[3, 5, 6, 9]
请按任意键继续. . .