无事小神仙~

起因

  • 自己写了个小工具, 在自己的环境上运行正常,发送给同事。由于同事电脑上没有安装 VS,导致会显示 “由于找不到 XXX.dll......” 这样的报错。遂研究了一下原因。

原因

  • VS 默认为动态编译
  • 静态编译在程序编译时 dll 会被连接到目标代码中,程序运行时将不再需要该静态库。
  • 动态编译在程序编译时 dll 并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

解决方案

  • 只需设置为静态编译即可,让 dll 写进 exe 内,没有外部库也可以运行。

方法一

  • 将 debug 模式换成 release 模式。

方法二

  • 在 Visual Studio 的项目属性窗口中,选择“配置属性” > “C/C++” > “代码生成”。
  • 将“运行库”选项设置为“多线程(/MT)”或“多线程调试(/MTd)”。
  • 这将使用静态链接的方式将运行时库(包括 DLL)合并到可执行文件中。
  • 注意,配置属性的时候,上面有个平台,注意设置成“所有平台”

方法三(这个方法我没有尝试,但应该可以)

  • 将 DLL 文件添加为资源文件到项目中。在 Visual Studio 中,右键点击项目,选择“添加” > “现有项”。
  • 在资源视图中,右键点击项目的资源文件,选择“属性”。
  • 将“资源 ID”设置为一个唯一的整数值。
  • 在代码中,可以使用 Win32 API 函数 LoadLibrary 或 LoadLibraryEx 加载嵌入的 DLL 资源。

补充

  • 静态库中未被使用的函数会被链接到目标文件中吗?

    • 没有明确的规定,取决于链接器实现。但链接器是以目标文件为链接单位的,通常来说,如果一个目标文件完全没用到,那这整个目标文件都不会被链接进去。如果目标文件中的一部分被用到了,那么其他没用到的部分要看具体情况,是全局函数,类成员函数?还是全局变量,静态变量之类的。