vc使用gcc编译的dll

本文详细阐述了在不同编译器环境下调用DLL时遇到的类导出问题,以及如何通过封装类功能为项目提供函数来解决这一难题。重点强调了统一编译器的重要性,并揭示了在使用LoadLibrary加载DLL时DLLMain函数的必要性。

你妹的情人节,今天搞了一天的dll的动态加载。

Here is the thing. 项目中我用写了一个类,GNU编译器测试可用。提交给使用类的同志时,他发现我的类在编译时有问题。就是那万恶的vc宽字符,我也懒得改了干脆商量着做成dll吧。好嘛,三下五除二,没要两分钟写了个dll出来,又写了个测试程序,同样在g++ 下测试通过。拿过去给那位同志用,怎料头疼的事情就这样开始了。类导不出来……我滴,搞了一个上午发现GNU与VC在实现Dll中的类是使用不同的策略与方式的,说白了二者不能相互调用!!!难道要我重新用VC写?肿么可能呢!好吧,我干脆用函数将类实现的主要功能封装起来,直接提供函数供项目使用。同样我还是使用GNU编译器……哭疼了,就栽在使用不同的编译器上了。在使用VC调用我写的Dll时,动态加载怎么也成功不了……经过长时间的郁闷后终于发现在使用LoadLibrary时,加载的dll一定要有dllMain函数,不然……LoadLibrary默认返回NULL!!!(因为LoadLibrary就是看DllMain的返回值返回东西,你都没有DllMain……不说了)

总结一下,一个项目中编译器最好统一!!!!不然……后果很严重。

编译生成 Boost 库的 DLL 文件,需要在构建过程中指定动态链接库(shared)的方式进行编译。Boost 默认支持静态链接和动态链接两种方式,若希望生成 `.dll` 文件,则必须使用 `link=shared` 选项,并确保运行时链接也为共享模式 `runtime-link=shared`。 以下是一个典型的编译命令示例,适用于使用 GCC 工具链在 Windows 上编译 Boost 的 64 位 DLL 文件: ```shell b2 --toolset=gcc --prefix=D:\Boost address-model=64 link=shared runtime-link=shared threading=multi install ``` 该命令会将 Boost 编译为多线程支持、64 位架构、动态链接库形式,并安装到 `D:\Boost` 目录下[^1]。 如果使用的是 Visual Studio 工具集(例如 MSVC),则需替换 `--toolset` 参数为对应的版本号,如 `msvc-14.3` 表示 Visual Studio 2022 的编译器工具链。以下是以 Visual Studio 2022 构建 Boost 动态链接库的示例命令: ```shell b2 toolset=msvc-14.3 link=shared runtime-link=shared address-model=64 --build-type stage ``` 上述命令会生成带有 `boost_` 前缀命名的 DLL 和对应的 `.lib` 导入库文件。这些库文件名中包含编译器版本、线程模型、调试标记等信息,例如:`boost_filesystem-vc143-mt-x64-1_81.dll`,其中 `mt` 表示多线程支持,`x64` 表示目标平台为 64 位,`1_81` 表示 Boost 版本为 1.81 [^4]。 完成编译后,应将生成的 `.dll` 文件与项目可执行文件一起部署,或将它们放置在系统路径中,以确保程序运行时能够正确加载 Boost 的动态库资源[^1]。 ### 注意事项: - 使用动态链接库可以减小最终应用程序体积,并允许多个程序共享相同的 Boost 库。 - 若选择静态链接,则不会生成 `.dll` 文件,而是直接将 Boost 代码嵌入到应用程序或静态库中[^4]。 - 在项目配置中,务必确保所使用的 Boost 构建配置(debug/release、32/64 位、多线程/单线程)与项目的构建设置一致,否则可能导致链接错误或运行时异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值