尽管源代码中有 (dllexport) 指令,是否存在一种可能未记录的方法来阻止链接器IMPLIB
为 DLL 或 EXE创建?__declspec
指定没有使用默认名称创建的/IMPLIB
结果。.LIB
当 declspec 指令来自不受控制的第 3 方代码时,这一点很重要。例如,情况就是这样boost::serialization
。一种可能的解决方案是“取消声明”DLL 导出。DEF 文件也不能这样做(AFAIK),因为它只能添加到导出列表而不能从中删除。
尽管源代码中有 (dllexport) 指令,是否存在一种可能未记录的方法来阻止链接器IMPLIB
为 DLL 或 EXE创建?__declspec
指定没有使用默认名称创建的/IMPLIB
结果。.LIB
当 declspec 指令来自不受控制的第 3 方代码时,这一点很重要。例如,情况就是这样boost::serialization
。一种可能的解决方案是“取消声明”DLL 导出。DEF 文件也不能这样做(AFAIK),因为它只能添加到导出列表而不能从中删除。
使用包含用 PRIVATE 关键字标记的导出函数的 .def 文件将告诉链接器跳过将符号放入导入库中。
有关 MSVC 的 .def 文件语法的详细信息,请参阅此 MSDN 页面。
据此,如果您在链接时提供.exp
文件,链接器将不会创建.lib
文件。不过,老实说,我不知道这对你的情况是否有帮助。
使用链接器选项没有任何方法可以做到这一点,当链接器使用它来命名 .exp 文件时,使用 /implib:"nul" 会惨遭失败。最实用的解决方案是在构建后再次删除文件。项目 + 属性、构建事件、构建后事件并粘贴:
del $(TargetDir)$(TargetName).lib
del $(TargetDir)$(TargetName).exp
许多 3rd 方代码不__declspec(dllexport)
直接使用,而是将其隐藏在宏下以便对其进行控制。通常,他们希望根据包含头文件的位置(在 dll 实现内部或由 dll 的用户)之间dllexport
进行切换dllimport
如果在您尝试包含的库中是这种情况,那么通过宏操作来更改此行为以满足您的确切需求应该不会太难。
例如,boost::serialization
检查config.hpp
并查看如何控制它。