C 语言静态库与动态库的生成和使用

在 YouTube 上找到一个视频 动态链接库静态链接库的生成和使用,它把用 GCC 生成静态库和动态库,以及如何使用他们说的很明白,有条件的可以直接看那个视频。本文就是一个观后的实操和笔记,加添了更多如何查看动态库,静态库,目标文件,执行文件的过程。

为什么要了解静态库和动态库呢?这有助于我们理解多模块的 C/C++ 代码是如何联合工作的。我们多数时候使用的 IDE, 一个 Build 帮我们做了太多的事情,反而使我们眼前一抹黑,这背后有怎么把一个个源文件编译成目标文件(*.o) 文件,或生成静态库/动态库,又如何连接静态库/动态库生成可执行文件,等等。

试验中使用的平台是 Linux, 如果没有 Linux 可通过 Docker 容器得到一个,如

$ docker run -it -v $(pwd):/work -w /work rust:1.78-buster bash

为什么使用 rust:1.78 镜像,其实也没什么特别的,因为当前在学习 Rust, 而正好该镜像中有 GCC 编译器。启动该容器后,为编辑需要,最好安装一个 vim,在容器中运行 阅读全文 >>

Windows 安装使用 GCC(mingw-w64)

本人近十来年来本地用 Mac OS 开发, 服务器为 Linux, 为什么又要涉及到 Windows 的 GCC 呢?因为有个跨平台的东西用的是 C++, 需要分别编译出目标平台为 Linux 和 Windows 的二进制文件. 然而 C++ 并没有像 Rust 那样一出生就含着 Cargo 那样的工具链,完美的支持跨平台开发,构建。对于 C++ 代码不得不在 Linux 下用 GCC 编译器(Makefile), 而 Windows 下使用的 Visual Studio 的 MSBuild, 为了能统一用 Makefile 文件 + GCC 的方式编译 C++ 项目, 可选择 Windows 平台下也安装 GCC。

GCC 又是什么呢?它是 GNU 的编译工具集,包括对 C, C++, Objective-C, Foratran, Ada, Go 和 D 等一众语言的支持, 和它类似的工具集有 LLVM。GCC 支持多操作系统平台,怎么找到它的各种二进制安装包呢?我们循着官网去找, 打开 GCC 首页 https://gcc.gnu.org/,从页面的右边栏可找到 阅读全文 >>

C++ 多重继承和虚继承的内存布局

这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见这里(By Edsko de Vries, January 2006)

敬告: 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识。

本文我们将阐释GCC编译器针对多重继承和虚拟继承下的对象内存布局。尽管在理想的使用环境中,一个C++程序员并不需要了解这些编译器内部实现细节,实际上,编译器针对多重继承(特别是虚拟继承)的各种实现细节对于我们编写C++代码都或多或少产生一些影响(比如downcasting pointer、pointers to pointers 以及虚基类构造函数的调用顺序)。如果你能明白多重继承是如何实现的,那么你自己就能够预见到这些影响,进而能够在你的代码中很好地应对它们。再者,如果你十分在意的代码的运行效率,正确地理解虚继承也是很有帮助的。最后嘛,这个hack的过程是很有趣的哦:) 阅读全文 >>

VBA 中发送邮件(三. 使用 XMLHttpRequest 组件)

w3 JMail 组件虽好用,但实际使用过程中还是碰到问题,多数机器上都表现正常,唯独在一台机器上,JMail 的错误信息总是:jmail The message was undeliverable. All servers failed to receive the message。根据经验把病毒软件、防火墙都关了,Telnet 到邮件服务器的 25 端口,或者 Outlook 收发都是正常的,这下有些没辙了,而同事真正又要在那台奇怪的机器上发邮件。

再想它法了,对,就是 XMLHttpRequest,把功能分离,Excel 只提交 Http 请求,由 JSP 来完成实际的邮件发送工作,当然也可以实现为其他的形式。所以也就有两部分实现代码,分别为:

JSP 代码,使用的是 Apache 的 commons-email 组件,它还需要用到 activation.jar 和 mail.jar,关于 commons-email 的使用可参考前面的一篇:用 apache commons-email 轻松发送无乱码邮件。比如文件存为 sendmail.jsp,通过浏览器来访问时用的 URL 是 http://192.168.1.100:8080/WebUtils/sendmail.jsp阅读全文 >>

VBA 中发送邮件(二. 使用 JMail 组件)

在上一篇 VBA 中发送邮件(使用 Outlook)中,VBA 通过 Outlook 来发邮件不仅频繁的弹出提示窗口要求确定,而且需要在 Outlook 中配置好,不能随意使用邮件服务器。对此,是否有相当于 JavaMail 那样的第三方组件呢?Google 帮忙,果然找到一个,名曰 w3 JMail,J 为首,其实与 Java 无任何关系。

可以在网络上搜索 w3 JMail Personal V4.3,或者直接到官网 http://www.dimac.net 去下载,w3 Jmail 的授权方式是免费的。默认位置安装好 JMail 之后,是在 C:\Program Files\Dimac\w3JMail4 可以看到 Examples 目录、jmail.dll、w3jmail4.pdf 和 readme.txt 文件。可以查阅w3jmail4.pdf 中的使用帮助。我们所要的文件其实只是那个 jmail.dll,安装程序会自动帮你注册 jmail.dll。若未运行安装程序,只是拷贝了 jmail.dll,则要运行 regsvr32 jmail.dll 注册它即可。 阅读全文 >>

VBA 中发送邮件(一. 使用 Outlook 组件)

帮同事做了一个在 Excel 中用 VBA 发邮件的程序,逐行读取 Excel 表格记录中的待发邮件主题、内容及收件人进行发送。首先想到也是看看能否使用 Outlook 的组件,网上查了查,果然有,现把代码贴出来如下: 阅读全文 >>

VC++6.0 下搭建 wxWidgets 开发环境

和 GTK、QT、SWT、SWING 一样,wxWidgets 也是一种开源跨平台的 GUI 框架。因 wxWidgets 和 MFC 有些渊源,有些亲近,故要体验一番 wxWidgets。现在最新版是 2.8.7。wxWidgets 程序还可运行于 Windows CE、Palm OS。不但包括 GUI,还有 Media、Socket、ODBC 等库。

详情请见 wxWidgets 的官方网站是:http://www.wxwidgets.org

本篇介绍 VC++6.0 下如何搭建 wxWidgets 的开发环境,包括编译 wxWidgets 源码和配置 VC 环境。所用 wxWidgets 的版本是 2.8.7。

第一步:下载并安装 wxWidgets

http://www.wxwidgets.org/downloads/ 下载到 wxWidgets 源码。 阅读全文 >>

VC窗口(控件)中显示指定 URL 对应图片

在上篇 VC 中用 IPicture 在窗口中显示图片文件 讲到的是 VC 窗口(或控件)中显示本地图片文件,本文延伸这一话题,来演示如何显示网上的图片,即提供图片的 HTTP URL 地址,把它显示到 VC 的界面中来。

本文参考我原来写的一篇日志 VC中使用CInternetSession抓取网页内容 来修改上篇代码中用来显示图片的函数:HRESULT ShowPic(char *lpstrFile,HWND hWnd)。把研究过的东西整理记下来总是好处多多,瞧,至少现在展开其他话题,可参考时便能信手拈来。

重新实现的函数 HRESULT ShowPic(char *lpstrFile,HWND hWnd) 代码如下: 阅读全文 >>

VC 中用 IPicture 在窗口中显示图片文件

想做个东西,用VC,希望是在程序界面上能把指定 URL 的图片显示出来,还没找到如何显示 HTTP 资源的图片,先还是让本地图片能在 VC 的窗口(包括各种控件)中显示出来吧。在网上搜索了一番,大家代码都如出一辙,我也不能生搬硬载,不由又亲手实践了一下,并连同原来学过的 Window SDK 做窗口程序也复习了一遍,没有使用到 MFC,只需存成单个源文件,甚至用 CL 命令来编译都无须打开 VC 的,在 VC6 中测试通过。

效果图如下: 阅读全文 >>