Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
C++ g++;链接vs VisualC++;连接_C++_G++_Static Linking - Fatal编程技术网

C++ g++;链接vs VisualC++;连接

C++ g++;链接vs VisualC++;连接,c++,g++,static-linking,C++,G++,Static Linking,我已经试着让它工作了一段时间,但在其他地方找不到答案,这是我的问题 当我在VisualC++中制作一个静态库时,这个库所使用的任何依赖关系都被传递到我将库链接到的可执行程序中。这里有一个例子 Test.lib取决于 -SDL -OpenGL TestApp.exe链接Test.lib 在VisualC++中,我不必在TestApp可执行文件中添加Test.LIB的依赖项,它们被继承并运行得很好。 但是,当我将代码移植到LinuxG++(使用code::Blocks IDE)时,如果我在g++中创

我已经试着让它工作了一段时间,但在其他地方找不到答案,这是我的问题

当我在VisualC++中制作一个静态库时,这个库所使用的任何依赖关系都被传递到我将库链接到的可执行程序中。这里有一个例子

Test.lib取决于 -SDL -OpenGL

TestApp.exe链接Test.lib

在VisualC++中,我不必在TestApp可执行文件中添加Test.LIB的依赖项,它们被继承并运行得很好。 但是,当我将代码移植到LinuxG++(使用code::Blocks IDE)时,如果我在g++中创建一个静态库,即.a,并创建一个链接库的TestApp,它将获得对依赖项的未定义引用

g++能够做到这一点吗?如果是的话,我缺少什么来将依赖项转移到我的可执行文件中


至于我的库设置,我只使用IDE的静态库设置。

静态库不会与其他库静态链接。听起来对吗? 但是,您可以使用名为的工具将许多对象文件打包在一起


在windows上发生的事情可能是因为您在系统环境路径中的某个地方有(SDL,opengl32)DLL

静态库不会与其他库静态链接。听起来对吗? 但是,您可以使用名为的工具将许多对象文件打包在一起



在windows上发生的事情可能是因为您在系统环境路径中的某个地方有(SDL,opengl32)DLL

使用Microsoft的编译器,头文件中可以包含库依赖项信息(源文件也是如此,但这通常在头文件中完成);这将被编译到对象文件中,链接器理解并应用该信息。这可能很方便:您不必记住冗长、古怪的名称,如果您使用不兼容的选项编译两个源文件,您可能会遇到链接器会抱怨的库名称冲突。大多数编译器和链接器都不做这种事情,您必须明确地告诉链接器要链接到哪些库。

使用Microsoft的编译器,头文件中可以包含库依赖项信息(源文件也是,但这通常在头文件中完成);这将被编译到对象文件中,链接器理解并应用该信息。这可能很方便:您不必记住冗长、古怪的名称,如果您使用不兼容的选项编译两个源文件,您可能会遇到链接器会抱怨的库名称冲突。大多数编译器和链接器都不做这种事情,你必须明确地告诉链接器你要链接哪些库。

可能需要补充的是,DLL不是静态库,OP需要使用gccOk手动包含库依赖项,因此这里有另一个不同的场景,我在TinyXML的windows中有一个静态库,没有DLL,所有内容都是静态链接的,在我的应用程序项目中,我不需要像在静态库中那样添加TinyXML的依赖项,但是在GCC中它不需要this@AdrianCornish-DLL确实不是静态库,但每个DLL都有一个对应的静态库,其中保存着有关其导出名称的信息,为了使用DLL,您必须链接到该库(除非您手动加载并手动查找入口点)。@PeteBecker:这实际上是Microsoft链接器的限制,而不是DLL的限制。MinGW实际上可以在没有静态“导入”库的情况下链接DLL。请注意,DLL不是静态库,OP需要使用gccOk手动包含库依赖项,因此这里有另一个不同的场景,我在TinyXML的windows中有一个静态库,没有DLL,所有内容都是静态链接的,在我的应用程序项目中,我不需要添加TinyXML的依赖项,因为它在我的静态库中,但是在GCC中它不需要this@AdrianCornish-DLL确实不是静态库,但每个DLL都有一个对应的静态库,其中包含有关其导出名称的信息,为了使用DLL,你必须链接到该库(除非你要手动加载并手动查找入口点)。@PeteBecker:这实际上是微软链接器的限制,而不是DLL的限制。通过进入构建设置,MinGW实际上可以链接DLL,而无需那些静态“导入”libsI am链接(在代码块中),并且在链接器设置下添加-lTestLib,其中我的库名为libTestLib.a,在Visual Studio中,我只是将库添加到依赖项中,就像正常情况一样,我不使用任何命令行内容,正如IDE在链接器设置中显示的那样,它提供了浏览文件或指定文件名的选项,以及如何将VS中的TestLib与SDL、OpenGL链接?您需要使用ar工具打包SDL和GL的.o文件以及TestLib.oIn。在Visual Studio中,我只需将我的项目设置为静态库并设置我希望使用的所有库,默认设置会自动将我的依赖项传递到使用库的任何项目。所以,当我用代码块创建静态库时,它实际上并没有将SDL、OpenGL和TestLib库放在一起?我需要有礼貌地这样做?是的。在windows上,您可能解析引用,因为SDL.dll和opengl32.dll位于系统环境路径中。我正在通过进入“生成设置”链接(在代码块中),并在“链接器设置”下添加-lTestLib,其中我的库名为libTestLib.a,在VisualStudio中,我只是将库添加到依赖项中,因为我不使用任何命令行内容,只是IDE在链接器设置中显示的内容,它提供了浏览文件或指定文件名的选项,以及如何将VS中的TestLib与SDL、OpenGL链接?您需要将SDL和GL的.o文件与ar工具以及TestLib.oIn打包在一起。在Visual Studio中,我只需设置项目