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 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

(八)高性能服务器架构设计总结3——以flamigo服务器代码为例

再看filezilla,一款ftp工具的服务器端,它采用的是Windows的WSAAsyncSelect模型(代码下载地址:https://github.com...

3366
来自专栏从流域到海域

Python 异常类继承树

BaseException SystemExit KeyboardInterrupt GeneratorExit Exception StopIte...

1749
来自专栏计算机视觉与深度学习基础

Leetcode 题目列表(难度、出现频率、知识点)

不全,但好像没看到有更好的版本,刷前132题暂时凑合着用吧! 转载自:LeetCode Question Difficulty Distribution ?...

3146
来自专栏编程之路

Swift纯代码 UICollectionView 分组显示、Cell圆角、选中变色

上一篇介绍了如何使用swift纯代码构建UIColletionView,本篇继续介绍如何对其分组、设置分组标题、cell 圆角、选中变色。 效果图如下:

561
来自专栏WOLFRAM

用 Wolfram 语言来做2017年高考数学试题之新课标Ⅲ理科卷

1934
来自专栏Android干货

Android项目实战(八):列表右侧边栏拼音展示效果

2745
来自专栏闵开慧

eclipse中运行hbase时显示Connection refused: no furthe...

java.net.ConnectException: Connection refused: no further information at ...

4037
来自专栏SAP最佳业务实践

想学FM系列:预算地址派生案例的伪代码

DATA: HIE_INPUT TYPE FMHIE_S_ADDRESS_KEY, HIE_OUTPUT TYPE FMHIE_S_B...

3243
来自专栏闵开慧

centos6.5桌面版网络设置情况

DEVICE=eth0 TYPE=Ethernet UUID=3769d1ce-fcb8-4cc9-b4f6-fb24204d10ef ON...

3985
来自专栏行者常至

org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: where near line 1, col

org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: wh...

381

扫码关注云+社区