静态库与动态库相互调用

测试场景,Test,lib1,lib2,dll1,dll2,分为下面四种情况:
1、Test->lib1->lib2
lib1编译自己的代码,对lib2的部分,只需要lib2的头文件,对lib2的代码实现,使用占位符关联。
生成Test连接的时候,把lib1的代码实现包含进来,再递归,把lib1中关联lib2的代码实现也包含进来。
运行Test的时候,不再需要lib1和lib2。

2、Test->lib1->dll2
lib1编译自己的代码,对dll2的部分,只需要dll2的头文件,对dll2的代码实现,使用占位符关联。
生成Test连接的时候,把lib1的代码实现包含进来,但是,dll2中的代码不包含进来。
运行Test的时候,不需要lib1,但是需要dll2【不需要dll的lib文件】

3、Test->dll1->lib2
dll1编译自己的代码,对lib2的部分,需要lib2的头文件和实现,即lib2,把lib2的代码实现包含到dll1中
生成Test连接的时候,dll1中的代码不包含进来,并且不再需要lib2。
【可以这样测试,生成lib2,生成dll1,生成test.exe,删除lib2,删除test.exe,再生成test.exe,可以生成成功。说明生成test.exe,连接的时候根本不需要lib2,。也就是说,静态库会被连接到动态库或者exe中,但是不会被连接到其他的静态库中】
运行Test的时候,需要dll1,但是不需要lib2

4、Test->dll1->dll2
dll1编译自己的代码,对dll2的部分,需要dll2的头文件和lib文件,对dll2的代码实现,使用占位符关联。
生成Test连接的时候,Test需要dll1的lib,dll1需要dll2的lib,但是代码实现都不会包含在Test中。
运行Test的时候,需要dll1和dll2【不需要他们的lib】

VS2017多版本VC支持

前言

研究目标:VS2017作为目前最新的IDE,让其支持所有版本的VC编译环境

必要性:报建通依赖的特定版本的AutoCAD作为“宿主”环境,作为一个通用产品,就需要支持所有的AutoCAD版本。现在AutoCAD版本需要支持的版本有AutoCAD 2005-2015,其中从AutoCAD 2010开始支持x64,按照一般情况,就需要针对每一个版本安装一个对应的Visual Studio IDE版本,这样给“环境的搭建”、“项目工程的管理”带来很大的挑战和负担

难点:目前每个Visual Studio集成编译环境仅支持对应版本的工程,且作为微软闭源的产品,不支持人为配置
继续阅读 »

Qt 5.10.1 & vs2017 静态编译

  • 2018-03-05

准备:

1、源代码&编译器

继续阅读 »

libuv 在win10 vs各个版本编译静态库

01 环境

libuv使用git管理代码,使用gyp管理工程文件。git、python2.x必须。
环境描述:
win10x64企业版本(10.0.14393),
vs2005–vs2015,
python2.7.6,
git(version 1.9.5.chromium.6)。
git和python建议使用更高版本。
因为下载gyp管理工具需求翻墙,需要vpn。自己有美国的vps,可以自己搭建。
官网:http://libuv.org/
github源码:https://github.com/libuv/libuv

02 源码下载

命令提示符窗口输入:
继续阅读 »

牢记25个最佳的SSH命令

OpenSSH是SSH连接工具的免费版本。telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击。此外,OpenSSH提供了安全隧道功能和多种身份验证方法,支持SSH协议的所有版本。

SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选。下面是通过网络投票选出的25个最佳SSH命令,你必须牢记于心。

(注:有些内容较长的命令,在本文中会显示为截断的状态。如果你需要阅读完整的命令,可以把整行复制到您的记事本当中阅读。)
继续阅读 »

PXE分发安装CentOS 6.5

一.kickstart流程图

二.安装前准备
1.关闭iptables

2.关闭Selinux

继续阅读 »

Keepalived虚拟机搭建(适用于真实服务器)

软件介绍

什么是负载均衡高可用

nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。

为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

什么是keepalived

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
继续阅读 »

使用libevent多线程验证Linux上的服务器”惊群”现象

什么是惊群现象?

惊群(thundering herd)是指,只有一个子进程能获得连接,但所有N个子进程却都被唤醒了,这种情况将使性能受损。
举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。对于操作系统来说,多个进程/线程在等待同一资源时,也会产生类似的效果,其结 果就是每当资源可用,所有的进程/线程都来竞争资源,造成的后果:
1)系统对用户进程/线程频繁的做无效的调度、上下文切换,系统系能大打折扣。
2)为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销。

最常见的例子就是对于socket描述符的accept操作,当多个用户进程/线程监听在同一个端口上时,由于实际只可能accept一次,因此就会产生惊群现象.这个问题是一个古老的问题,新的操作系统内核已经解决了这一问题。

在多线程情况下,每个线程都监听同一个fd,当有数据来的时候,是否会有惊群现象呢?验证如下
继续阅读 »

Haproxy+Keepalived主主高可用

HAProxy是高性能的代理服务器,其可以提供7层和4层代理,具有healthcheck,负载均衡等多种特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。KeepAlived是一个高可用方案,通过VIP(即虚拟IP)和心跳检测来实现高可用。其原理是存在一组(两台)服务器,分别赋予Master,Backup两个角色,默认情况下Master会绑定VIP到自己的网卡上,对外提供服务。Master,Backup会在一定的时间间隔向对方发送心跳数据包来检测对方的状态,这个时间间隔一般为2秒钟,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,把VIP绑定到自己的网卡,此时Backup对外提供服务,实现自动化的故障转移,当Master恢复的时候会重新接管服务。
我们的keepalived主主的应用场景:因为我们需要同时为主域名和图片服务器域名同时提供分发请求,所以用到了Haproxy+keepalived主主模式。
默认情况下,第一台负载均衡器主要分发www.baison.com.cn的请求,第二台负载均衡器主要分发img.baison.com.cn的请求。任意一台宕机都不会影响网站分发。这样不会导致服务器浪费。


继续阅读 »

通过ssh用rsync无密码传输文件

在linux平台上常用rsync协议来同步文件和目录,’rsync’也是各种linux发行版标配的命令。当我们基于linux平台开发应用程序时,常常需要从Java或者Python代码中调用rsync命令来实现文件的传输。

例如,假设我们要按照如下需求来传输文件:

  • 有两台机器:localhost和remotehost
  • Java程序deploy在localhost上,通过rsync将本机文件传送到remotehost,或者从remotehost pull文件到localhost
  • rsync通过ssh连接remotehost
  • 在remotehost有个叫test的帐户,专门用来rsync传输文件,只能用密钥文件登陆
  • 最重要的是,在rsync连接过程中不需要输入test的帐户密码,否则密码输入界面会block住Java程序的运行

要实现rsync的无密码传输,基本思路是用一对公私钥来代替帐户密码,实现ssh连接时的认证。
继续阅读 »