C++ 禁止创建导入库-Visual C++;连接器
尽管源代码中有C++ 禁止创建导入库-Visual C++;连接器,c++,visual-c++,dll,dllexport,import-libraries,C++,Visual C++,Dll,Dllexport,Import Libraries,尽管源代码中有\uuuuu declspec(dllexport)指令,但是否有一种可能没有文档记录的方法阻止链接器为DLL或EXE创建IMPLIB 指定no/IMPLIB将导致使用默认名称创建.LIB 当declspec指令来自不受控制的第三方代码时,这一点很重要。例如,boost::serialization就是这种情况。一种可能的解决方案是“取消声明”DLL导出。DEF文件也无法执行此操作(AFAIK),因为它只能添加到导出列表中,而不能从中删除。根据,如果在链接时提供.exp文件,链接器
\uuuuu declspec
(dllexport)指令,但是否有一种可能没有文档记录的方法阻止链接器为DLL或EXE创建IMPLIB
指定no/IMPLIB
将导致使用默认名称创建.LIB
当declspec指令来自不受控制的第三方代码时,这一点很重要。例如,
boost::serialization
就是这种情况。一种可能的解决方案是“取消声明”DLL导出。DEF文件也无法执行此操作(AFAIK),因为它只能添加到导出列表中,而不能从中删除。根据,如果在链接时提供.exp
文件,链接器将不会创建.lib
文件。不过,老实说,我不知道这对您的情况是否有帮助。许多第三方代码不直接使用\u declspec(dllexport)
,而是将其隐藏在宏下以控制它。通常,他们希望根据头文件包含的位置(dll实现内部或dll用户)在dllexport
和dllimport
之间切换
如果在库中出现这种情况,那么通过宏操作来改变这种行为以满足您的确切需求应该不会太困难
例如,
boost::serialization
检查config.hpp
并查看如何控制它。使用链接器选项无法做到这一点,当链接器使用/implib:nul来命名.exp文件时,它会失败。最实用的解决方案是在生成后再次删除文件。项目+属性、生成事件、生成后事件和粘贴:
del $(TargetDir)$(TargetName).lib
del $(TargetDir)$(TargetName).exp
使用包含用PRIVATE关键字标记的导出函数的.def文件将告诉链接器跳过在导入库中放置符号
有关MSVC的.def文件语法的更多信息,请参阅。如果不需要,是否可以将其删除?真正的问题是什么?真正的问题是链接器进行这些(大型公司的开发人员生产力优化)所需的时间。我想知道是否有可能创建一个空的EXP文件来提供它。尽管如此,仍然会创建.lib和.EXP文件。