1.动态链接库的创建
直接按图片的顺序一步一步来即可
//dllTest.h
#pragma once
#ifdef dllTest_EXPORTS
#ifdef __GNUC__
#ifndef __linux__
#define DLL_TEST_API __attribute__((dllexport))
#else
#define DLL_TEST_API __attribute__((visibility("default")))
#endif
#else
#define DLL_TEST_API __declspec(dllexport)
#endif
#else
#ifdef __GNUC__
#ifndef __linux__
#define DLL_TEST_API __attribute__((dllimport))
#else
#define DLL_TEST_API __attribute__((visibility("default")))
#endif
#else
#define DLL_TEST_API
#endif
#endif
namespace dllTest
{
//定义整个类都是dll导出函数
class DLL_TEST_API CTest
{
public:
CTest();
CTest(int a, int b)
{
m_index1 = a;
m_index2 = b;
}
int Add(int a, int b);
private:
int m_index1;
int m_index2;
};
//__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,
//加入extern "C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们
/*
总结:
1.extern "C"表示编译生成的内部符号名使用C约定。
2.C++支持函数重载,而C不支持,两者的编译规则也不一样,函数被C++编译后在符号库中的名字与C语言 的不同。
例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
*/
#ifdef __cplusplus
extern "C"
{
#endif
DLL_TEST_API void Test();
#ifdef __cplusplus
}
#endif
}
//dllTest.cpp
#include "dllTest.h"
#include <iostream>
dllTest::CTest::CTest()
{
m_index1 = 0;
m_index2 = 0;
}
int dllTest::CTest::Add(int a, int b)
{
return a + b;
}
void dllTest::Test()
{
std::cout << "Test" << std::endl;
}
在属性页-->"c/c++"---->"预处理器"中将上述代码中的dllTest_EXPORTS加入到预处理器定义中
编译生成就可以得到dll和lib
2.动态库的调用
创建dllTest_test的项目来调用上面创建的dll,将dllTest的头文件和lib、dll放在3rdparty中,供调用使用
//dllTest_test.cpp
#include <iostream>
#include "dllTest.h"
int main()
{
dllTest::CTest test;
std::cout << test.Add(1, 2)<<std::endl;
dllTest::Test();
}