目录
二.C++如何引用C的静态库和C如何引用C++的静态库(跨语言问题)
一.如何制作一个静态库
注意:!!!!!如果你的静态库是C语言编写的,仅仅经过下述操作,你引用这个静态库也得是在C语言的环境下,如果你的静态库是C++写的,你引用这个静态库也得在C++的环境下
1.打开vs2019,选择静态库
2.选择静态库并创建
3.选择属性->C++->预编译头->不使用预编译头
4.这个时候把IDE给你创建好的文件全部删除,我们先不使用他们
5.写自己的代码(不用包含main函数,因为我们不用让他跑起来),比如说,举一个例子吧,我来给一段代码,这段代码大致作用是初始化一个栈和打印栈的信息,为了方便看到现象,我在初始化的时候给栈里的元素赋了值,所以打印出来的大致效果是
0->1->2->3->4->5->6->7->8->9->
Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef struct stack
{
int* data;
int capacity;
int top;
}stack;
#define INIT 10
void InitStack(stack* ps);
void Print_Stack(stack ps);
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void InitStack(stack* ps)
{
ps->data = (int*)malloc(sizeof(int) * INIT);
if (ps->data == NULL)
{
perror("malloc::");
return;
}
ps->top = 0;
ps->capacity = INIT;
int i = 0;
while (i < INIT)
{
ps->data[ps->top] = i;
i++;
ps->top++;
}
}
void Print_Stack(stack ps)
{
int i = 0;
while (i < ps.top)
{
printf("%d->", ps.data[i]);
i++;
}
}
代码写完了检查无误,我们点击生成解决方案,如果你的代码没有问题,就可以在工程文件夹的Debug目录下找到刚刚生成的.lib文件
如图所示
那么我们怎么使用这个静态库呢,我们可以新建的工程,先包含我们刚才生成静态库所用到的.h(不用非得回以前的工程文件找,只要是这个.h就行)
第二步找到项目的属性
在属性里的链接器的附加库目录中添加你.lib文件的根目录(就是我们刚才静态库里包含.lib的那个Debug文件夹)
然后在输入里加入你的.lib文件的名称,比如我生成的.lib文件就叫Stack.lib
好了,至此我们就可以使用这个库里所包含的一些结构体和函数了,如图,我们代码可以正常运作了
二.C++引用C的静态库和C引用C++的静态库
假设我们引用静态库我们的源文件是.cpp,而我们的静态库是.c的文件,这个时候我们会发现有报错。
这个是因为在编译器中,C++和C的函数命名规则不同,所以我们引用.h文件的时候,假设我们引用静态库的工程是C语言编写的(同时静态库是由C++编写的),编译的时候就会默认按照C的方式来编译函数名,所以就找不到C++的静态库编译后的函数名称,同理,引用静态库的工程是C++语言编写的(同时静态库是由C编写的),编译的时候就会默认按照C++的方式来编译函数名,所以就找不到C的静态库编译后的函数名称,为了解决这个问题最中心的思想是记住一点,动.cpp文件。
以下分为两种情况:
1.如果静态库是用C语言编写,引用的工程文件是由C++编写
只需要在引用头文件的前后加上extern “C”,这个时候默认展开这个.h头文件时编译函数名就会按照C的规则去编译函数名称
2.如果静态库是用C++编写,引用的工程是由C语言编写
这个时候我们需要去改变C++静态库的头文件中的内容,如图所示。
问题迎刃而解