C++ C++;:静态和动态库(编译和运行)

C++ C++;:静态和动态库(编译和运行),c++,dll,static,compilation,C++,Dll,Static,Compilation,我正在做一个图书馆项目,这个项目已经差不多完成了。所以我现在给它一个测试运行。我运行我的测试项目没有问题。然而,我不完全确定我是否做对了。主要是因为我不太明白到底发生了什么(至少我不完全确定) 我已经编译了DLL和静态库(.a)。对于我的测试项目,我使用我的库中的头文件,并针对静态库进行链接。我能编译。但是,我似乎还需要可执行文件所在的DLL,以便它运行 据我所知,我使用静态库进行编译,但我并没有将它嵌入到我的可执行文件中,因此在运行时它会查找DLL 我的困惑来自这样一个事实,即静态库通常嵌入到

我正在做一个图书馆项目,这个项目已经差不多完成了。所以我现在给它一个测试运行。我运行我的测试项目没有问题。然而,我不完全确定我是否做对了。主要是因为我不太明白到底发生了什么(至少我不完全确定)

我已经编译了DLL和静态库(.a)。对于我的测试项目,我使用我的库中的头文件,并针对静态库进行链接。我能编译。但是,我似乎还需要可执行文件所在的DLL,以便它运行

据我所知,我使用静态库进行编译,但我并没有将它嵌入到我的可执行文件中,因此在运行时它会查找DLL

我的困惑来自这样一个事实,即静态库通常嵌入到可执行文件中。但这不是只有在编译器选项中指定时才会发生吗

在我的处境下,我对这种关系感到相当困惑。有人能澄清一下吗

编辑: 我正在使用GCC。 Codelite作为我的IDE。

库在编译时是静态的(不能在运行时动态链接)。因此,您认为lib“嵌入”在可执行文件中是正确的。更准确地说,lib链接到编译器生成的用于构建exe文件的其他对象文件。库不能链接到另一个库,只有exe或dll可以链接到库

dll在运行exe时由exe动态链接。dll类似于另一个exe,但其输入函数是“dllmain”而不是“main”。dll可以像exe一样使用lib构建。dll还可以在运行时链接到其他dll,以与这些dll的功能接口。dll的接口由def文件定义

至于项目需要dll的原因,您可能需要检查项目中LoadLibrary的调用。

lib在编译时是静态的(无法在运行时动态链接)。因此,您认为lib“嵌入”在可执行文件中是正确的。更准确地说,lib链接到编译器生成的用于构建exe文件的其他对象文件。库不能链接到另一个库,只有exe或dll可以链接到库

dll在运行exe时由exe动态链接。dll类似于另一个exe,但其输入函数是“dllmain”而不是“main”。dll可以像exe一样使用lib构建。dll还可以在运行时链接到其他dll,以与这些dll的功能接口。dll的接口由def文件定义



至于为什么您的项目需要dll,您可能需要检查项目中LoadLibrary的调用。

您说的是dll,所以我假设您的目标是windows。Windows的操作与其他任何操作都不同。这是你的目标平台还是我假设错了?@Wug现在它是我的目标平台是的。但是这个库也应该在Linux中工作(尽管还需要测试)。目前windows是这样的。在windows中,静态库通常是.lib。你在用什么工具?您是如何创建静态库的。如果您是针对.lib进行链接,但仍然需要相应的.dll,那么您似乎是在使用include lib进行链接-这些库实际上并不包含代码,而是使到dll的静态链接非常容易(显然需要100%兼容的dll)@AlanStokes我在使用gcc。不是VC。就像我说的,它是一个“.a”文件。你说的是dll,所以我假设你的目标是windows。Windows的操作与其他任何操作都不同。这是你的目标平台还是我假设错了?@Wug现在它是我的目标平台是的。但是这个库也应该在Linux中工作(尽管还需要测试)。目前windows是这样的。在windows中,静态库通常是.lib。你在用什么工具?您是如何创建静态库的。如果您是针对.lib进行链接,但仍然需要相应的.dll,那么您似乎是在使用include lib进行链接-这些库实际上并不包含代码,而是使到dll的静态链接非常容易(显然需要100%兼容的dll)@AlanStokes我在使用gcc。不是VC。就像我说的,它是一个“.a”文件。考虑到他的描述,他有点可能是在链接一个导入库(它也使用.lib扩展名),但是如果库已经嵌入到可执行代码中,那么链接到库又有什么意义呢?老实说,我不知道如何检查LoadLibrary@它是一个“.a”文件。但是应该没什么区别吧?@Sidar,如果我没记错的话。a是Unix上静态库的默认文件扩展名。正如您所说,您当前使用的是Windows,我认为这里唯一的区别是文件扩展名-可以使用dumpbin进行检查(如果您的系统上有)。如果这个假设成立,并且lib只是一个导入库,那么很明显,为什么链接到lib后仍然需要DLL。@MFH虽然我希望它保持原样,但我从未指定任何导入/导出宏。进口是标准吗?或者IDE附带的我的项目模板中有一些设置吗?@Sidar:下面可能是Microsoft的方式(我只能猜测GCC也有相同的设置):如果您构建了一个DLL,您将获得一个库作为额外的输出。如果链接到此库,则DLL的依赖项将自动解析,并且您不必使用LoadLibrary-DLL将在运行时加载,但=>必须在程序启动时出现。考虑到他的描述,他很可能链接到导入库(也使用.lib扩展名)但是,如果库已经嵌入到可执行代码中,那么链接到库有什么意义呢?老实说,我不知道如何检查LoadLibrary@它是一个“.a”文件。但是应该没什么区别吧?@Sidar,如果我没记错的话。a是Unix上静态库的默认文件扩展名。正如您所说的,您当前使用的是Windows,我认为这里唯一的区别是文件扩展名-