Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VisualC++中创建.LIB文件和.exe文件?_C++_Visual C++_Linker_Static Libraries - Fatal编程技术网

如何在VisualC++中创建.LIB文件和.exe文件?

如何在VisualC++中创建.LIB文件和.exe文件?,c++,visual-c++,linker,static-libraries,C++,Visual C++,Linker,Static Libraries,我目前有一个创建.exe文件的控制台项目;我希望它还创建一个.lib文件,以便其他编译为DLL的项目能够从原始项目调用函数 我知道这是可能的,但我不知道怎么做。如何告诉链接器也链接一个.lib?一般来说,这是不可能的-静态库和可执行文件是完全不同的类型。处理这种情况的方法是创建两个项目——一个用于包含所有功能的库。还有一个用于可执行文件,它是一个薄包装,只调用库中的函数。如果不链接库,则创建一个静态库项目。后者根本不调用链接器-而是使用cl/c编译所有文件,并使用lib.exe将生成的.objs

我目前有一个创建.exe文件的控制台项目;我希望它还创建一个.lib文件,以便其他编译为DLL的项目能够从原始项目调用函数


我知道这是可能的,但我不知道怎么做。如何告诉链接器也链接一个.lib?

一般来说,这是不可能的-静态库和可执行文件是完全不同的类型。处理这种情况的方法是创建两个项目——一个用于包含所有功能的库。还有一个用于可执行文件,它是一个薄包装,只调用库中的函数。

如果不链接库,则创建一个静态库项目。后者根本不调用链接器-而是使用cl/c编译所有文件,并使用lib.exe将生成的.objs组合成一个lib。

如果应用程序.exe项目中有任何符号被导出,例如使用u declspecdllexport,则会生成.exe和.lib文件 见:

将此作为参考发布我知道原始帖子是很久以前发布的,但这仍然适用于需要解决此问题的任何人

转到要为其创建.lib文件的项目,然后执行以下步骤:

右键单击项目。 选择属性。 选择构建事件。 选择预链接事件。 最后,在命令行中粘贴以下内容:

@呼应 @ECHO$VC\u ExecutablePath\u x86\lib.exe/out:$OutDir$ProjectName.lib$intermediateoutput路径*.obj $VC\u ExecutablePath\u x86\lib.exe/out:$OutDir$ProjectName.lib$intermediateoutput路径*.obj


这将调用lib工具从生成的对象文件中生成lib文件。

令人惊讶的是,有多少贡献者傲慢地坚持错误的答案,而他们根本不知道答案

要生成与.exe关联的.lib,请在预链接事件中放置以下行:

"$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

但就在这里,我有一个vcproj文件,它最终有一个exe和一个lib。。。然而,在我的一生中,我找不到是什么让它这么做的@Spidey推测该项目包含两个子项目。同意。使exe项目依赖于lib项目,它将在需要时自动重新编译。我知道,解决方案中的一个项目实际上是一个静态库,另一个项目使用它,正如您所建议的。谢谢标题中的问题是正确的。然而,这将如何帮助身体中的另一个问题;能够从原始[EXE]项目调用函数吗?您可以链接到生成的.lib;.exe的行为类似于DLL。i、 符号是在运行时从.exe加载的。我测试了我在上一条评论中写的内容。它有时工作,有时不工作,出现无法初始化应用程序0xC0000005错误。使用LoadLibrary和GetProcAddress也会导致内存问题。因此,实际上我不知道如何正确使用生成的.lib。有点晚了,但无论如何我还是要感谢你:你让我的生活变得更轻松了。obj的默认区域设置在项目文件夹中,所以我将$IntermediateOutputPath*.obj更改为$SolutionDir$ProjectName\$Configuration*.obj。很好用,谢谢。