使用 gcc 11.2 在 linux 上编译 imgui、glfw、opengl 失败

Posted

技术标签:

【中文标题】使用 gcc 11.2 在 linux 上编译 imgui、glfw、opengl 失败【英文标题】:failure to compile imgui, glfw, opengl on linux with gcc 11.2 【发布时间】:2021-12-06 19:01:07 【问题描述】:

我最近开始使用 c++ 进行编码,而我目前正在进行的项目需要 imgui。所以我在与源代码相同的文件夹中的一个名为“include”的文件夹中设置了 .h 和 .cpp 库。我目前正在尝试在https://github.com/ocornut/imgui/tree/master/examples/example_glfw_opengl3 中运行cpp,并使用gcc imgui.cpp -lstdc++ -lglfw -lGL -limgui 使用gcc 对其进行编译,但我只是得到了

/usr/bin/ld: cannot find -limgui
collect2: error: ld returned 1 exit status

是的,我知道链接中有一个 make 文件,但我正在使用另一个文件夹中的文件。

【问题讨论】:

只有在链接器的搜索路径上有libimgui.solibimgui.a 时才有效。您是否自己将 imgui 编译到库中?否则,您需要将 imgui cpp 文件添加到您的构建过程中,如 here 所述 我想你想删除-limgui @Botje 它说我不必编译库我可以只使用 .cpp 文件中的代码块,我已经导入到我的项目文件中,当我尝试编译它时'g++ -lstdc++ imgui*.h imgui*.cpp' 它只是吐出错误'/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../.. /x86_64-linux-gnu/Scrt1.o:在函数_start': (.text+0x20): undefined reference to main'' 【参考方案1】:

假设您将 imgui 下载到名为 $IMGUI_DIR 的位置,并且包含您的 main 函数的文件是 main.cpp,您的编译命令行应该如下所示:(\ 只是用来分解命令)

g++ main.cpp -o main \
$IMGUI_DIR/imgui*.cpp $IMGUI_DIR/backends/imgui_impl_glfw.cpp $IMGUI_DIR/backends/imgui_impl_opengl3.cpp \
-I $IMGUI_DIR -I $IMGUI_DIR/backends \
-lglfw -lGL

按顺序,你告诉编译器:

您的代码在哪里以及将输出放在哪里 要包含哪些 Imgui 代码,即核心库和您要使用的两个后端 Imgui 代码应在何处查找其标头

如果这一切听起来很多,请知道您可以简单地构建您链接的示例并在编译时使用 make IMGUI_DIR=/path/to/imgui 覆盖 IMGUI_DIR

【讨论】:

运行 'g++ main.cpp -o main include/imgui/imgui*.cpp include/imgui/backends/imgui_impl_glfw.cpp include/imgui/backends/imgui_impl_opengl3.cpp -I include/imgui -I include/imgui/backends -lglfw -lGL -ldl' 成功了。非常感谢,我已经为此工作了几天 下一步显然是使用适当的构建系统,例如 CMake 或 Make。或者至少将 imgui 编译成一个静态库,这样您就不必在每次更改应用程序时都重新编译它。

以上是关于使用 gcc 11.2 在 linux 上编译 imgui、glfw、opengl 失败的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 11.2 是不是支持向后兼容在 CUDA 10.2 上编译的应用程序?

如何在linux上编译C语言? 没有安装gcc组件怎么办?

如何在linux上编译c工程文件

在 Mingw 上编译的 C/C++ 代码能否保证与 GCC 完全兼容(在 linux 和 Mac 上)

BFD_RELOC_64:使用 C++ 在 32 位 linux 上编译汇编器指令

代码在 gcc 上编译,但不在 msvc 上