概述
- 提供windows下mingw64和msvc编译器的一键编译脚本,
- 其中msvc编译器是免费的ms_buildtools,下载路径:https://aka.ms/vs/17/release/vs_buildtools.exe
- mingw64环境的下载路径:https://www.msys2.org/docs/environments/
测试源码
#include <stdio.h>
#include <ctime>
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
float fa = 11.1234;
float fb = 22.1234;
float fc = 33.1234;
float fd = 44.1234;
uint32_t ua = 111;
uint32_t ub = 222;
uint32_t uc = 333;
uint32_t ud = 444;
int32_t a = -111;
int32_t b = -222;
int32_t c = -333;
int32_t d = -444;
#define MAX_BUF_SIZE 1024 * 245
char buf[MAX_BUF_SIZE] = {0};
const uint32_t fmtstr_len = 64;
static const char* fmt = "\n%.3f,%.3f,%.3f,%.3f,%u,%u,%u,%u,%d,%d,%d,%d";
clock_t start = clock();
for (uint64_t i = 0; i < 1000; i++) {
uint32_t buf_size = MAX_BUF_SIZE;
char* ptr = buf;
while (buf_size - fmtstr_len > 0) {
snprintf(ptr, buf_size, fmt, fa, fb, fc, fd, ua, ub, uc, ud, a, b, c, d);
ptr += fmtstr_len;
buf_size -= fmtstr_len;
}
}
clock_t end = clock();
double elapsed_secs = static_cast<double>(end - start) / CLOCKS_PER_SEC;
std::cout << elapsed_secs << " s" << endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(snprintf_test LANGUAGES CXX)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(snprintf_test main.cpp)
windows编译脚本
@echo off
:: VC free compiler download url:https://aka.ms/vs/17/release/vs_buildtools.exe
echo "====== build start..."
set ROOT_PATH=D:\win_build_package
:: compile solution
if not "%1"=="" (
set ROOT_PATH=%1
)
echo "====== ROOT_PATH is :" %ROOT_PATH%
set "CURRENT=%cd%"
cd /d %ROOT_PATH%\BuildTools\VC\Tools\MSVC
for /f "delims=" %%i in ('dir 1* /b') do (
set MSVC_VER=%%i
GOTO :BREAK
)
:BREAK
echo "MSVC_VER is "%MSVC_VER%
cd /d "%CURRENT%"
set Path=%ROOT_PATH%\BuildTools\VC\Tools\MSVC\%MSVC_VER%\bin\Hostx64\x64;%ROOT_PATH%\CMake_64\bin;%Path%
call %ROOT_PATH%\BuildTools\VC\Auxiliary\Build\vcvarsall.bat amd64
::create empty build directory
set BUILD_DIR=build_mscv
if not exist %BUILD_DIR% (md %BUILD_DIR%) else (del %BUILD_DIR% /a/s/q)
cd /d %BUILD_DIR%
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
nmake
cd ..
echo "====== build success ^_^"
mingw64编译脚本
#!/bin/bash
echo "====== build begin... "
export ROOT_PATH="/d/win_build_package"
if [ -n "$1" ] ;then
export ROOT_PATH=$1
echo "the word you input is $ROOT_PATH"
fi
export MINGW_TOOLCHAIN_PREFIX=$ROOT_PATH"/msys64/mingw64/bin/"
export PATH=$MINGW_TOOLCHAIN_PREFIX:$PATH:$ROOT_PATH"/msys64/usr/bin"
echo $PATH
export CC=${MINGW_TOOLCHAIN_PREFIX}g++
export CXX=${MINGW_TOOLCHAIN_PREFIX}g++
export STRIP=${MINGW_TOOLCHAIN_PREFIX}strip
export AR=${MINGW_TOOLCHAIN_PREFIX}ar
export OBJCOPY=${MINGW_TOOLCHAIN_PREFIX}objcopy
export RANLIB=${MINGW_TOOLCHAIN_PREFIX}ranlib
export READELF=${MINGW_TOOLCHAIN_PREFIX}readelf
export make=${MINGW_TOOLCHAIN_PREFIX}mingw32-make.exe
export LINKFLAGS="-pthread -ldl -lwsock32 -lws2_32 -Wl,-Bstatic -static"
export DYNA_LINKFLAGS="-pthread -ldl -lwsock32 -lws2_32 "
export OTHER_CFLAGS="-mno-ms-bitfields -w"
export OTHER_LIB_BUILD_CFLAG="-lwsock32"
export ARCH_TAG=-mingw64
export MINGW64=1
BUILD_DIR=build_mingw
if [ ! -d $BUILD_DIR ]; then
mkdir $BUILD_DIR
else
rm -rf $BUILD_DIR/*
fi
cd $BUILD_DIR
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ..
make
cd ..
echo "====== build success ^_^"