glog/gflags:linux下用cmake通过MinGW-w64交叉编译生成windows版本静态库

ubuntu16下,先要安装mingw

sudo apt-get install mingw-w64

如果没有安装cmake,记得安装,

sudo apt-get install cmake

做交叉编译时要指定toolchain文件

Toolchain-mingw.cmake

# 设置交叉编译的目标操作为windows
SET(CMAKE_SYSTEM_NAME Windows)

# 指定c/c++编译器
SET(CMAKE_C_COMPILER  x86_64-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)

# 指定编译目标操作系统版本时的搜索根路径
SET(CMAKE_FIND_ROOT_PATH  /usr/x86_64-w64-mingw32 )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

build_gflags_mingw.sh

#!/bin/bash
# 静态编译 gflags 源码脚本
# author guyadong@gdface.net

# $gflags_source gflags源码位置
pushd $gflags_source
#install_path 定义安装路径
# CMAKE_TOOLCHAIN_FILE 指定上面定义的toolchain文件的位置
# BUILD_SHARED_LIBS=off 不编译动态库
# BUILD_STATIC_LIBS=on 编译静态库
# BUILD_gflags_LIB 编译多线程库
# INSTALL_STATIC_LIBS=on 安装静态库
# INSTALL_SHARED_LIBS=off 不安装动态库
# REGISTER_INSTALL_PREFIX=off 不写注册表
# 以上定义的更详细的信息参见gflags源码 $gflags_source/CMakeLists.txt
cmake . -DCMAKE_TOOLCHAIN_FILE=./Toolchain-mingw.cmake \
    -DCMAKE_INSTALL_PREFIX=$install_path \
    -DBUILD_SHARED_LIBS=off \
    -DBUILD_STATIC_LIBS=on \
    -DBUILD_gflags_LIB=on \
    -DINSTALL_STATIC_LIBS=on \
    -DINSTALL_SHARED_LIBS=off \
    -DREGISTER_INSTALL_PREFIX=off
make clean
make -j 8 install
popd

glog的过程也差不多 build_glog_mingw.sh

#!/bin/bash
# cmake静态编译 glog 源码脚本
# author guyadong@gdface.net

# 定义上面脚本编译的gflags的安装位置中CMake文件夹位置
gflags_DIR=$GFLAGS_INSTALL_PATH/CMake
pushd $glog_root
# CMAKE_EXE_LINKER_FLAGS指定静态连接所有库
# gflags_DIR=$gflags_DIR 指定依赖的gflags静态库位置
cmake . -DCMAKE_TOOLCHAIN_FILE=$BIN_ROOT/Toolchain-mingw.cmake \
    -DCMAKE_INSTALL_PREFIX=$install_path \
    -DCMAKE_EXE_LINKER_FLAGS="-static -static-libstdc++ -static-libgcc" \
    -Dgflags_DIR=$gflags_DIR 
make clean
make -j 8 install
popd

上面的脚本直接编译肯定通不过,会报错:找不到BaseTsd.h这个头文件,这算是glog代码的小bug,BaseTsd.h是在msvc中的一个头文件。 这是个一般编译器都提供的系统头文件,在gcc下这个文件名是全小写(basetsd.h),因为linux下文件名都区分大小写,所以会报错,找到报错的位置 ($glog_root/src/logging.cc),将BaseTsd.h改为basetsd.h就可以了。

如果安装了wine (sudo apt-get install wine),编译通过后可以直接在linux下运行一下生成的exe文件

wine xxxx.exe

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大壮

videocore 和 Swift 混编引发的坑(实战篇)

1897
来自专栏IT可乐

SpringMVC详解(一)------入门实例

  本系列教程我们将详细的对SpringMVC进行介绍,相信你在学完本系列教程后,一定能在实际开发中运用自如。 1、什么是 SpringMVC ?   在介绍什...

2147
来自专栏Java技术栈

Spring Boot Runner启动器

Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLine...

2627
来自专栏Java成神之路

hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...

可等Hadoop退出安全模式后再执行HBase命令,或者手动退出Hadoop的安全模式

962
来自专栏吴生的专栏

使用 maven 生成一个支持端到端自动测试的 RESTful 服务项目脚手架

和传统后端页面生成技术相较, RESTful 数据服务专注与数据逻辑, 而将数据呈现完全交给前端应用. 这样做可以让后端开发更加单纯, 而且更容易测试. 本文将...

3545
来自专栏码匠的流水账

使用SseEmitter不断向网页输出结果

之前写过一篇文章:springmvc不断输出文本到网页,采用的是对response不断进行write和flush实现的。在spring 4.2版本的时候提供了一...

2081
来自专栏Danny的专栏

【EJB学习笔记】——实体Bean

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

823
来自专栏Java工程师日常干货

MyBatis+Spring MVC开发指南(三)

本系列的前面2篇文章,已经为大家介绍了MyBatis;从本篇博客开始将为大家介绍Spring MVC开发的那些事!关于Spring MVC这块将会涵盖Sprin...

781
来自专栏会跳舞的机器人

Spring Cloud(2)——服务提供者

前言: 本文中的注册中心基于Spring Cloud(1)——服务注册中心,请先了解注册中心的相关知识后再阅读本文。

1283
来自专栏JAVA高级架构

Spring MVC工作原理

1122

扫码关注云+社区