https://slproweb.com/products/Win32OpenSSL.html
分类目录归档:C++
openssh的编译
1.执行autoheader,使其生成config.h.in文件。
2.执行autoconf,使其生成configure文件。
3.执行./configure,生成makefile文件。
4.make生成ssh
mintty的Cmake配置
cmake_minimum_required(VERSION 3.12)
project(src C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -include std.h -Wall -Wextra -Wundef -Werror -mtune=atom -g -O0 -fstack-check")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc -MMD -MP")
#当使用add_definitions设置时,res.rc文件是无法编译通过的,要使用CMAKE_C_FLAGS。
#add_definitions(-static-libgcc -MMD -MP -std=gnu99 -include std.h -Wall -Wextra -Wundef -Werror -mtune=atom -g -O0 -fstack-check)
message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
message("CMAKE_RC_COMPILER=${CMAKE_RC_COMPILER}")
include_directories(.)
link_directories(/usr/lib/w32api)
add_executable(mintty WIN32
appinfo.h
base64.c
base64.h
charset.c
charset.h
child.c
child.h
config.c
config.h
ctrls.c
ctrls.h
jumplist.c
jumplist.h
mcwidth.c
minibidi.c
minibidi.h
print.h
printers.c
res.h
sixel.c
sixel.h
sixel_hls.c
sixel_hls.h
std.c
std.h
term.c
term.h
termclip.c
termline.c
termmouse.c
termout.c
termpriv.h
textprint.c
win.h
winclip.c
winctrls.c
winctrls.h
windialog.c
winids.h
winimg.c
winimg.h
wininput.c
winmain.c
winpriv.h
winsearch.c
winsearch.h
wintext.c
wintip.c
res.rc)
target_link_libraries(mintty libusp10.a libgdiplus.a libcomctl32.a libimm32.a libwinmm.a libwinspool.a libole32.a libuuid.a)
使用匿名函数,简易地把同步转异步
使用匿名函数,简易地把同步转异步。
大概思路,已经省去了线程池的相关说明。
#define MYASSERT(x)
typedef std::function FunAsyncTask;
typedef std::function FunSuccessCallBack;
typedef std::function FunErrorCallBack;
//从KAsyncTask派生
class AsyncTask
{
private:
const FunAsyncTask task;
const FunSuccessCallBack ok_cb;
const FunErrorCallBack err_cb;
const QPointer callerThiz; //外部调用者的This指针,目的利用它来检验当前匿名函数所捕获的参数是否仍有效。
QVariant result;
QVariant err;
//ToDo保存调用线程,调用线程与成功及错误的处理是同一个线程,也即是调用成功及错误之前先检查线程是否相同。
int threadCallId; //任务请求的线程。
int threadDoTaskId; //任务处理的线程
public:
static void post_aync_task(QObject *thiz, FunAsyncTask t, FunSuccessCallBack ok, FunErrorCallBack err)
{
AsyncTask *task = new AsyncTask(thiz, t, ok, err);
//ToDo推送至多线程任务队列。
}
private:
AsyncTask(QObject *thiz, FunAsyncTask t, FunSuccessCallBack ok, FunErrorCallBack err)
: callerThiz(thiz), task(t), ok_cb(ok), err_cb(err)
{
threadCallId = GetCurrentThreadId();
}
void run()
{
// AnyncThread do the job.
threadDoTaskId = GetCurrentThreadId();
try
{
result = task();
//ToDo Save Ok
}
catch (...)
{
//TODO Save Error;
}
}
void handleResult()
{
//ToDo MainThread to do the job.
MYASSERT(callerThiz);
MYASSERT(threadCallId == GetCurrentThreadId());
ok_cb(result);
}
void handleError()
{
//ToDo MainThread to do the Error
MYASSERT(callerThiz);
MYASSERT(threadCallId == GetCurrentThreadId());
err_cb(err);
}
};
void assertValidTaskLambda(char* txt)
{
//ToDo提取lamda表达式的中括号的参数进行检查,不允许使用"=&"的特殊字符,有该字符则输出错误及抛出异常。
//提取括号外及大括号前的字符串,不允许"mutable"参数使用。
printf("\r\n%s", txt);
}
void assertValidCallBackLambda(char* ok, char* err)
{
//ToDo提取lamda表达式的中括号的参数进行检查,不允许使用"&"的特殊字符,有该字符则输出错误及抛出异常。
//提取括号外及大括号前的字符串,不允许"mutable"参数使用。
printf("\r\n%s-%s", ok, err);
}
#define POST_AYNC_TASK(task, ok_cb, err_cb) \
{\
assertValidQObject(this); \
assertValidTaskLambda(#task); \
assertValidCallBackLambda(#ok_cb, #err_cb) \
AsyncTask::post_aync_task(this, task, ok_cb, err_cb); \
}
int MyClass::execute()
{
int x = 1;
int y = 2;
int z = 3;
int m = 4;
FunAsyncTask task = [x, y, z]()->int{
return QVariant(123);
};
FunSuccessCallBack ok = [x, m](QVariant r){
printf("ok...ok...%d", r);
};
FunErrorCallBack err = [z, m](QVariant err){
printf("failed...failed...%d", err);
};
POST_AYNC_TASK(task, ok, err); //这种使用,报错。
// 推荐以下方式使用,目的是语法检查,减少多线程出错。
// POST_AYNC_TASK((task_exp),(ok_exp),(err_exp))
// 如果表达式不用括号包裹起来的话,可能会导致编译出错。
POST_AYNC_TASK(([x, y, z]()->QVariant{
int v1 = x;
int v2 = v1*2;
Sleep(1000);
return QVariant(v2 + z);
}), ([=](QVariant r){
printf("ok...ok...%d", r);
}), ([=](QVariant err){
printf("failed...failed...%d", err);
}));
getchar();
}