libxlsxwriter - 编译

概述

想换一个新版的libxlsxwriter, 自己编译一个出来.
libxlsxwriter依赖zlib, 前面已经成功编译了zlib(zlib - 编译).

笔记

libxlsxwriter的库地址 : https://github.com/jmcnamara/libxlsxwriter.git
迁出到本地
切换到最新的发布版本.
在这里插入图片描述
在这里插入图片描述

编译环境

VS2019 16.11.32
CMAKE version 3.20.21032501-MSVC_2
ZLIB v1.3

编译思路

官方工程中, 并没有对编译过程做详细说明.
这时, 可以看的就是工程自带的CMakeLists.txt 和CMake的官方帮助(https://cmake.org/cmake/help/v3.28/search.html?q=find_package)
在这里插入图片描述
在官方资料中搜索之前, 指定和自己用的CMake差不多的版本.

编译

打开命令行 ‘x64 Native Tools Command Prompt for VS 2019’
进入libxlsxwriter在本地的迁出目录.

cd /d D:\3rd_prj\excel\libxlsxwriter

建立一个编译用的目录并进入

mkdir .\build
cd /d .\build

在工程根目录建立zlib文件夹, 用于放置编译依赖的zlib组件. 主要是用到了存根.lib

mkdir ..\zlib

将自己编译的zlib组件拷贝过去, 最主要就是存根.lib, 这样VS工程就能建立.
其他缺啥, 等打开VS2019工程后, 缺啥补啥, 可以自己改配置.
在这里插入图片描述
CMakeLists.txt 中要找(find_package)的zlib包叫做zlib, 所以要将自己编译的存根.lib(my_zlib_1d3.lib)改名为zlib.lib, 否则CMake编译报错

从源码建立一个VS2019 X64的工程, 并指定ZLIB依赖路径


cmake .. -G "Visual Studio 16 2019" -A x64 -DZLIB_ROOT:STRING=../zlib
D:\3rd_prj\excel\libxlsxwriter\build>cmake .. -G "Visual Studio 16 2019" -A x64 -DZLIB_ROOT:STRING=../zlib
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
-- The C compiler identification is MSVC 19.29.30153.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- The CXX compiler identification is MSVC 19.29.30153.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found ZLIB: D:/3rd_prj/excel/libxlsxwriter/zlib/zlib.lib (found version "1.3.#define ZLIB_VERSION "1.3"")
zlib version:
-- Configuring done
-- Generating done
-- Build files have been written to: D:/3rd_prj/excel/libxlsxwriter/build

编译成功了.
打开VS2019工程
在这里插入图片描述
在这里插入图片描述
尝试编译工程, 有啥错误就补啥, 主要是zlib依赖相关.

在这里插入图片描述
将自己编译zlib时的目录拷贝过来, 去掉除了.h之外的文件(*.c, *.rc, *.def).
在这里插入图片描述

再尝试编译
在这里插入图片描述
编译成功了.

安装组件

先尝试全部编译解决方案, 通过.
再编译INSTALL工程
在这里插入图片描述
编译成功后, 就会将.lib, *.h 拷贝到 C:\Program Files\xlsxwriter
在这里插入图片描述
将C:\Program Files\xlsxwriter拷贝到自己的开发目录做存档, 给以后的工程用.

写个测试程序, 看看编译的组件是否好使

代码就用官方的例子.
新建一个VS2019工程, 编译选项为x64 debug, 包含进自己编译的libxlsxwriter和zlib的库, 头, 摆好dll

// testA.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <windows.h>
#include "xlsxwriter.h"
#pragma comment(lib, "xlsxwriter.lib")
#pragma comment(lib, "my_zlib_1d3.lib")

int main()
{
    int i_rc = 0;

    lxw_workbook* workbook = workbook_new("utf8.xlsx");
    lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);

    worksheet_write_string(worksheet, 2, 1, "Это фраза на русском!", NULL);

    i_rc = workbook_close(workbook);

    return S_OK;
}


在这里插入图片描述
在这里插入图片描述
将自己编译的zlib.dll放到exe同级目录, 运行编译出来的exe, 成功. 生成了.xlsx.
在这里插入图片描述
libxlsxwriter工程的编译, 测试 都成功了.

备注 - debug版/release版要用不同的库,否则编译有警告

https://blog.csdn.net/LostSpeed/article/details/138269772

本地实验工程位置 - D:\my_dev\my_local_git_prj\soft\exp\exp009TestLink4098MsvcrtLib

失败尝试1 - 用VS2013编译libxlsxwriter

库版本1.15
在这里插入图片描述
将工程清干净(clean up, revert)
在这里插入图片描述
C:\CMakeX64\bin\cmake-gui.exe
在这里插入图片描述
在这里插入图片描述
cmake脚本对zlib版本有要求, 修改 CMakeLists.txt
在这里插入图片描述

# ZLIB
find_package(ZLIB REQUIRED "1.3")
list(APPEND LXW_PRIVATE_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS})
message("zlib version: " ${ZLIB_VERSION})

再用CMake配置试试
在这里插入图片描述
用图形化的cmake-gui配置错误。
看了一下上面我自己的笔记,用的是CMake命令行,那我也用命令行来搞吧…
将工程清干净(clean up, revert)
打开VS2013X64本地命令行
加入cmake的环境变量

set path=C:\CMakeX64\bin;%path%

确认cmake版本

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64>cmake --version
cmake version 3.29.3

切到libxlsxwriter源码目录

cd /d D:\3rd_prj\excel\libxlsxwriter
mkdir .\my_build && cd .\my_build
cmake .. -G "Visual Studio 12 2013 Win64"

报错 - 缺ZLIB

CMake Error at C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR 1.0)
Call Stack (most recent call first):
  C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/CMakeX64/share/cmake-3.29/Modules/FindZLIB.cmake:199 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:222 (find_package)


-- Configuring incomplete, errors occurred!

将自己的Zlib库拷贝进去
在这里插入图片描述

cls && del .\* /Q
清不干净,手工将my_build目录中的东西删掉
cmake .. -G "Visual Studio 12 2013 Win64" -DZLIB_ROOT:STRING=../zlib
CMake Error at C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find ZLIB (missing: 1.0) (found version "1.3")
Call Stack (most recent call first):
  C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/CMakeX64/share/cmake-3.29/Modules/FindZLIB.cmake:199 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:222 (find_package)

尝试将需要的ZLIB版本改到1.3
在这里插入图片描述

CMake Error at C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find ZLIB (missing: 1.3) (found version "1.3")
Call Stack (most recent call first):
  C:/CMakeX64/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/CMakeX64/share/cmake-3.29/Modules/FindZLIB.cmake:199 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:222 (find_package)

还是不行,上次我用VS2019的命令行编译可以的。
那去将zlib库按照默认的配置再编译一次,给这个编译配置用。

zlb库如果编译zlib1.0,是编译不过的。
现在准备按照vs2019的编译,然后将工具链降到vs2013, 然后哪里有问题修正哪里试试。
不行,现在用上面以前记录的笔记,也编译不过,找不到zlib.

看报错点,问题出在FindZLIB.cmake的实现。
在这里插入图片描述
vs2019自带的cmake版本是3.20, 我前一段时间换成3.29了(vs2019 - 替换vs2019自带的cmake)。替换的原因:有个开源工程,必须要CMake3.20以上的版本才行。

还好我做了备份,换回来,回到VS2019自带的CMake3.20。
先试试以前的命令行

cmake .. -G "Visual Studio 16 2019" -A x64 -DZLIB_ROOT:STRING=../zlib

报错,说缺 ZLIB_LIBRARY。
好奇怪,以前可以的。
将build目录内的东西手工删掉
改一下命令行

cmake .. -G "Visual Studio 16 2019" -A x64 -DZLIB_ROOT:STRING=../zlib -DZLIB_LIBRARY:STRING=../zlib/zlibwapi.lib

这回是OK的…
再将vs2019的CMake换为3.29, 再试试行不行?

CMake Warning (dev) at C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindZLIB.cmake:88 (message):
  ZLIB does not provide any COMPONENTS.  Calling

    find_package(ZLIB COMPONENTS ...)

  will always fail.
Call Stack (most recent call first):
  CMakeLists.txt:222 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Error at C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find ZLIB (missing: 1.0) (found version "1.3")
Call Stack (most recent call first):
  C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.29/Modules/FindZLIB.cmake:199 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:222 (find_package)


-- Configuring incomplete, errors occurred!

不行

编译libxlsxwriter必须用VS2019自带的cmake3.20

且CMake命令行必须如下:

cmake .. -G "Visual Studio 16 2019" -A x64 -DZLIB_ROOT:STRING=../zlib -DZLIB_LIBRARY:STRING=../zlib/zlibwapi.lib

折磨人啊:(

vs2019自带的cmake完整版本如下

D:\3rd_prj\excel\libxlsxwriter\build>cmake --version
cmake version 3.20.21032501-MSVC_2

vs2019自带的cmake位置如下

D:\3rd_prj\excel\libxlsxwriter\build>where cmake
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe

查看这个cmake.exe
在这里插入图片描述
这个cmake的编译类型是RelWithDebInfo(发行版带调试信息)
看引入表,看到依赖的是VC140的DLL(VS2015中编译出来的)和UCRT
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
想去查一下,微软是否开源了自己编译的CMake?
看着和公版的CMake不太一样啊。
如果有,我想试试MS官方出的CMake3.29是否可以正常配置libxlsxwriter?

查了, MS官方并不出自己编译的CMake版本…
CMake官方的历史版本地址 https://github.com/Kitware/CMake/releases
看看VS2019自带的这个CMake是否是CMake官方出的,如果是,说明在使用VS命令行配置CMake工程时,需要根据情况,更换VS自带的CMake版本,不是每个CMake版本都行的。

从CMake官方下载的CMake看版本信息,和VS2019自带的不太一样。

C:\Users\chenx\Downloads\Compressed\cmake-3.20.2-windows-x86_64\bin>cmake --version
cmake version 3.20.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

且没有调试信息。
且不依赖任何MS VS的DLL
现在看起来,大概率是MS给VS优化适配的CMake版本。
知道问题的边界在哪里就行了。
以后尽量用VS2019自带的CMake编译工程,如果哪个工程有要求,再换成自己替换的高版本CMake

尝试2 - 用VS2013编译libxlsxwriter

昨天实验,用VS2019自带的CMake编译libxlsxwriter好使。
VS2019X64本地命令行是自带内置的CMake的.

D:\my_dev\my_local_git_prj\soft\env_cmd>where cmake
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe

VS2013X64本地命令行不带CMake.
尝试将VS2019自带的CMake目录拷贝出来,作为一个公用组件给VS2013用。
在这里插入图片描述
将VS2019自带的CMake3.20拷贝到自己的工具链目录下
在这里插入图片描述
打开VS2013X64本地命令行
将CMake_3d2_vs2019加入临时PATH

set path=D:\my_dev\devToolSet\CMake_3d2_vs2019\bin;%path%
# 查看cmake版本
cmake --version
cmake version 3.20.21032501-MSVC_2

现在VS2013名林行用的CMake和VS2019自带的CMake版本一样了。
将libxlsxwriter库版本切到1.1.5
在这里插入图片描述
建立子目录zlib(D:\3rd_prj\excel\libxlsxwriter\zlib), 将前面编译好的zlib的VS2013版的库和头文件都拷贝过来,供libxlsxwriter的VS2013版的编译使用。
在这里插入图片描述
建立编译用的子目录.\build,保持子目录为空, 开始配置工程

cd /d D:\3rd_prj\excel\libxlsxwriter
mkdir .\build && cd .\build
# 如果多次编译时,.\build目录内容不为空,手工删掉, 保持目录为空
# 开始用CMake配置工程
cmake .. -G "Visual Studio 12 2013 Win64" -DZLIB_ROOT:STRING=../zlib -DZLIB_LIBRARY:STRING=../zlib/zlibvc_MultiByte_x64_Release_v120.lib

# 编译结果如下,可以看到,顺利配置成功
-- The C compiler identification is MSVC 18.0.40629.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/x86_amd64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- The CXX compiler identification is MSVC 18.0.40629.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/x86_amd64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found ZLIB: ../zlib/zlibvc_MultiByte_x64_Release_v120.lib (found version "1.3.#define ZLIB_VERSION "1.3"")
zlib version:
-- Configuring done
-- Generating done
-- Build files have been written to: D:/3rd_prj/excel/libxlsxwriter/build

在这里插入图片描述
用VS2019打开xlsxwriter.sln, 不升级工具链(维持VS2013工具链不变),这样就可以编译出VS2013版本的工程输出。
在这里插入图片描述
编译解决方案,有报错
在这里插入图片描述
日文这行删了,不需要
再次尝试编译,报错
在这里插入图片描述
日文这行删了,不需要
重新尝试“重新生成解决方案”, 编译成功。
设置所有工程(所有配置)的输出宏如下:
输出目录

$(SolutionDir)$(CharacterSet)_$(PlatformTarget)_$(Configuration)_$(PlatformToolset)\

中间目录

$(SolutionDir)$(ProjectName)_$(CharacterSet)_$(PlatformTarget)_$(Configuration)_$(PlatformToolset)_tmp\

目标文件名

$(ProjectName)_$(CharacterSet)_$(PlatformTarget)_$(Configuration)_$(PlatformToolset)

重新生成解决方案
运行测试
// 运行安装 // 这步可以在修改工程输出宏之前做,主要是要得到include目录,如果是在改工程输出宏之后做,有可能和CMake配置的名称不一样,导致安装失败

默认是多字节工程,改为Unicode工程,再编译输出一次。
输出归档,得到了宿主工程需要的所有版本的libxlsxwriter的库。
在这里插入图片描述
因为工程输出变了,不确定头文件是否变。
用CMake重新配置工程,再安装一次,得到所有版本的安装的头文件,确认一下。
在这里插入图片描述
比较过了,不管哪种输出库的头文件,都是一样的。

如果用CMake配置的原始工程,不管哪种工程都是编译成功的。
但是改了输出宏之后的工程,就会有日文引起的编译错误,也无所谓。
又实验了一次,只编译库和测试库,都是成功了,没有再出什么日文错误,好奇怪,先这样。
更新了4个输出库的归档。

备注

将libxlsxwriter编译成VS2013的库,过程还挺曲折的。
也学到了一些新东西。

留言整理

在这里插入图片描述

END

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐