cmake静态库xlog跨平台编译window linux

动态库和静态库的概念

动态库:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值