【发布时间】:2018-05-27 19:15:39
【问题描述】:
据我了解,Visual Studio 库项目在编译后使用两个单独的进程,具体取决于“常规/配置类型”设置:
如果选择了“静态库”,所有的目标文件都会被捆绑到最终的
.lib文件中,一个静态库。如果选择“动态库”,则所有目标文件连同依赖项一起链接在一起,并捆绑到最终的
.dll文件中,即一个动态库。同时,收集所有__declspec(dllexport)符号,并用于生成.lib文件,即导入库。
我想创建一个foo.lib/foo.dll 对,其中foo.lib 既是foo.dll 的导入库,又是一个静态库。我考虑了以下线索:
创建两个单独的项目,
FooLib和FooDll,以及 uselib.exein a post-build step to merge both.libfiles。这听起来像是最简单的选择,但需要将原本应该是一个有凝聚力的模块分成两半。创建单个 DLL 项目,让默认构建过程创建
foo.dll及其导入库。然后添加自定义构建步骤以手动收集目标文件并将它们与 lib 捆绑到导入库中。这听起来很乱,我不确定重复项会做什么。我尝试过处理
.def文件,但即使在dumpbin生成的lib 文件之后,我也对其行为感到有些困惑。此外,它需要一个明确的损坏符号列表,这是不切实际的。
有没有更简单的方法来实现混合.lib/.dll 组合?否则,我应该遵循哪条线索?
背景
此模块将用于多个.dlls 和一个.exe 链接在一起。我需要在运行时的结果过程中有一半数据的单个实例(这是由.dll 实现的,因为它只会加载一次),而另一半复制到每个.dll 或@ 987654343@并在其中初始化(通过.lib实现)。
【问题讨论】:
-
我其实不明白背景...你不能只是拆分你的代码,部分应该是一个项目中的静态库,而另一个项目中的动态库部分?加上运行时唯一的数据可以通过 dll 来实现!!!
-
@user1810087 你描述了第一条线索 :) 我会试着澄清最后一段。
标签: c++ visual-studio visual-c++ dll static-libraries