【问题标题】:Do GNU GCC compilers only accept "<filename>.a" files as libraries?GNU GCC 编译器是否只接受“<filename>.a”文件作为库?
【发布时间】:2020-12-14 13:57:42
【问题描述】:

所以,基本上我要问的是,如果 GNU GCC 编译器仅将“.a”文件识别为库文件,我之所以问这个问题是因为,我在我的 codeblocks cpp 项目中链接了 3 个库文件,两个的库文件具有“.a”扩展名,最后一个具有“.lib”扩展名。当我尝试构建项目时,这是我得到的错误:

-------------- Build: Debug in OpenGl_GLFW (compiler: GNU GCC Compiler)---------------

g++.exe -Wall -g -Idependencies\include -Idependencies\include
-IC:\Users\Mubarak\Documents\Programming\Cpp\OpenGl_GLFW\dependencies\include -c C:\Users\Mubarak\Documents\Programming\Cpp\OpenGl_GLFW\dependencies\lib\glew32s.lib -o obj\Debug\dependencies\lib\glew32s.o
g++.exe -Ldependencies\lib -Ldependencies\lib -LC:\Users\Mubarak\Documents\Programming\Cpp\OpenGl_GLFW\dependencies\lib -o bin\Debug\OpenGl_GLFW.exe obj\Debug\dependencies\lib\glew32s.o dependencies\lib\libglfw3.a dependencies\lib\libglfw3dll.a obj\Debug\src\main.o   -lopengl32.a dependencies\lib\glew32s.lib dependencies\lib\libglfw3.a -lopengl32.a dependencies\lib\glew32s.lib dependencies\lib\libglfw3.a
g++.exe: warning: C:\Users\Mubarak\Documents\Programming\Cpp\OpenGl_GLFW\dependencies\lib\glew32s.lib:
linker input file unused because linking not done
g++.exe: error: obj\Debug\dependencies\lib\glew32s.o: No such file or directory
Process terminated with status 1 (0 minute(s), 0 second(s)) 1
error(s), 1 warning(s) (0 minute(s), 0 second(s))

所以看起来 .lib 库文件有问题,我开始在 Visual Studio 社区编程,在那里,.lib 文件工作......所以我开始了解“如果同一编译器负责创建库文件,则库文件仅适用于特定编译器”我只是想确定这一点。

如果是这样,为什么不同的编译器会生成具有不同扩展名的库文件? 而且,不同的编译器编译不同吗?不同的编译器会产生不同的机器码吗?

【问题讨论】:

  • 我认为你遗漏了重要的部分:error: obj\Debug\dependencies\lib\glew32s.o: No such file or directory,所以看看为什么 glew32s.o缺席。
  • 没有源文件可以构建到目标文件中。因此,链接时没有要使用的目标文件。你认为提供...\lib\glew32s.lib 作为源输入会做什么?
  • 第一个 g++ 命令应该做什么?没有输入,它会写入一个名为 glew32s.o 的文件,这也没有意义。
  • @AProgrammer 是的,该文件不存在,问题是我有一个 .lib 文件,我尝试使用 g++.exe 编译 .lib 文件,它失败了,编译需要 .cpp 或 . c 文件。
  • @Someprogrammerdude idk,你有什么想说的吗?我所知道的是 .lib 文件是已经从源代码编译的库文件,所以我不明白为什么我需要另一个源文件。

标签: c++ opengl gcc codeblocks glew


【解决方案1】:

".lib" 库是动态类型的,编译器假定将它们插入代码不是程序员的工作。这些库以及“.dll”在编译过程中由编译器本身插入。您还可以使用其他扩展名,例如“.h”。

【讨论】:

  • 关于编译器创建不同的机器代码,是的。但只有在不同的操作系统上使用时,例如在Windows 32位和64位上编译是完全不同的机器代码
【解决方案2】:

.lib 可能是一个无法工作的 Visual Studio 静态库 无论如何都要使用 gcc

在其中一个 cmets 中发现了这一点,这意味着,visual studio 使用了 .lib 库,而 gcc 使用了 .a 库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多