动态库和静态库的概念
动态库:
windows 中动态库会生成2个文件: xlog.lib(这个是函数地址索引) 和 xlog.dll(这个才是动态库的实体)
linux中中的动态库是 libxlog.so 这样的
macOS的名称是 libxlog.dylib 这样的
静态库:
windows上会生成 xlog_d.lib 这样的
linux上是 libxlog.a 这种
macOS上是:libxlog.a
头文件的作用:函数名称和参数类型(用于索引查找函数地址),不引用,可以自己直接声明函数,知道名字可以调用系统 api 查找函数
这个是目录结构,其中xlog是依赖库,test_xlog是执行程序
xlog目录
CMakeLists.txt
#CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog)
add_library(xlog STATIC xlog.cpp xlog.h)
xlog.cpp
#include "xlog.h"
#include <iostream>
using namespace std;
XLog::XLog()
{
cout<<"Create XLog"<<endl;
}
xlog.h
//xlog.h
#ifndef XLOG_H //表示只能被一个cpp引用一次
#define XLOG_H
//__declspec(dllexport)
//__declspec(dllexport) 导出XLog类的函数到lib文件中
// xlog库文件调用 dllexport
// test_xlog 调用 dllimport
#ifndef _WIN32
#define XCPP_API
#else
#ifdef xlog_EXPORTS
#define XCPP_API __declspec(dllexport) //库项目调用
#else
#define XCPP_API __declspec(dllimport) //调用库项目调用
#endif
#endif
class XCPP_API XLog
{
public:
XLog();
};
#endif
我首次试验成功的时候xlog.h是这样的
//xlog.h
class XLog
{
public:
XLog();
};
#endif
然后在xlog目录下执行,这个样才能生成依赖库的文件
cmake -S . -B build
cmake --build build
这样就生成了一个libxlog.a的静态库的文件,这是linux下的
这个是windows下的
链接静态库
test_xlog目录下 继续执行这个 cmake -S . -B build cmake --build build
CMakeLists.txt
#CMakeLists.txt test_xlog 102
cmake_minimum_required(VERSION 3.20)
project(test_xlog)
#指定头文件查找路径
include_directories("../xlog")
# 指定库查找路径 windows下写 link_directories("../xlog/build/Debug ") link_directories("../xlog/build/Release")
link_directories("../xlog/build")
add_executable(test_xlog test_xlog.cpp)
# 指定加载的库
target_link_libraries(test_xlog xlog)
test_xlog.cpp
#include <iostream>
#include "xlog.h"
using namespace std;
int main()
{
XLog log;
cout<<"test xlog"<<endl;
return 0;
}
执行完命令后就会生成可执行文件
动态库的编译链接
在根目录下创建CMakeLists.txt, 然后执行这个 cmake -S . -B build cmake --build build 就可以编译链接动态库了
#CMakeLists.txt test_xlog xlog 102
cmake_minimum_required(VERSION 3.20)
project(xlog)
#指定头文件的查找路径
include_directories("xlog")
#添加xlog库编译 项目自带预处理变量 xlog_EXPORTS, 这里设置成SHARED
add_library(xlog SHARED xlog/xlog.cpp)
add_executable(test_xlog test_xlog/test_xlog.cpp)
#指定加载库
target_link_libraries(test_xlog xlog)
使用mingW
如果电脑上只有gcc编译器,需要加上-G “MinGW Makefiles” ,如果已经有默认的window编译器 只要这个就可以了cmake -S . -B build
cmake -S . -B build -G “MinGW Makefiles”
cmake --build build 生成的makefile在哪就在哪执行build
在windows下创建动态库要做注意以下
修改xlog.h
//xlog.h
#ifndef XLOG_H
#define XLOG_H
//__declspec(dllexport) windows下一定要写这个,注意是导出XLog 的类函数到lib文件中
//
class __declspec(dllexport) XLog
{
public:
XLog();
};
#endif
兼容性考虑最终要这写
#ifndef XLOG_H
#define XLOG_H
//__declspec(dllexport)
//__declspec(dllexport) 导出XLog类的函数到lib文件中
// xlog库文件调用 dllexport, 本库文件调用
// test_xlog 调用 dllimport , 要使用这个头文件的文件调用
#ifndef _WIN32
#define XCPP_API
#else
#ifdef xlog_EXPORTS
#define XCPP_API __declspec(dllexport) //库项目调用
#else
#define XCPP_API __declspec(dllimport) //调用库项目调用
#endif
#endif
class XCPP_API XLog
{
public:
XLog();
};
#endif