使用Premake集成Dear ImGui为静态库时遇imgui.h找不到问题
编辑:将主题修改为“将ImGui集成为静态库|动态库”
我在用Premake作为构建系统的C++项目里,尝试把Dear ImGui集成成静态库时碰到了问题。之前用同样的模式成功集成过GLFW(系统提供)、Glad、ViennaCL和Eigen这些库,直接调用useImGUI("opengl3", "GLFW")能正常编译,但把ImGui做成独立项目再链接时,出现了下面的错误:
../src/main.cpp:10:10: fatal error: imgui.h: 没有那个文件或目录 10 | #include "imgui.h"
项目目录结构
├── build │ ├── Makefile │ ├── MyProject.make │ └── obj ├── cr.sh ├── include │ └── test.hpp ├── premake.lua ├── README.md ├── src │ ├── main.cpp │ └── test.cpp └── vendor ├── boost ├── eigen ├── glad ├── glfw ├── imgui ├── premake.lua └── viennaCL
主premake.lua配置
可正常编译的配置
dofile "vendor/premake.lua" workspace "MeuProjeto" -- 其他配置 project "glad" -- 其他配置 project "MeuProjeto" -- 其他配置 useEigen() useViennaCL() useImGUI("opengl3", "glfw") useGLFW() useBoost('accumulators') links { "glad" }
无法编译的配置
dofile "vendor/premake.lua" workspace "MeuProjeto" -- 其他配置 project "glad" -- 其他配置 project "imgui" kind "StaticLib" language "C++" useImGUI("opengl3", "glfw") project "MeuProjeto" -- 其他配置 useEigen() useViennaCL() useGLFW() links { "imgui" } useBoost('accumulators') links { "glad" }
同样无法编译的配置
project "MeuProjeto" -- 其他配置 useEigen() useViennaCL() useGLFW() useImGUI("opengl3", "glfw") useBoost('accumulators') links { "glad" }
useImGUI函数定义
function useImGUI(...) local targets = {...} for _, target in ipairs(targets) do files { "vendor/imgui/*.cpp", "vendor/imgui/*.h", "vendor/imgui/backends/imgui_impl_" .. target .. "*", } end externalincludedirs { "vendor/imgui", "vendor/imgui/backends" } end
问题原因及解决办法
核心问题
当把ImGUI做成独立静态库项目时,useImGUI函数里的externalincludedirs只作用于imgui项目本身,主项目MeuProjeto并没有添加ImGUI的头文件搜索路径,导致编译主项目时找不到imgui.h。第三个“同样无法编译的配置”疑似复制笔误,但核心问题一致。
解决步骤
拆分
useImGUI函数功能
将原函数拆分为添加源文件和引入头文件路径两部分,适配两种集成场景:-- 给ImGUI库项目添加源文件 function addImGUISources(...) local targets = {...} for _, target in ipairs(targets) do files { "vendor/imgui/*.cpp", "vendor/imgui/*.h", "vendor/imgui/backends/imgui_impl_" .. target .. "*", } end end -- 给依赖项目添加ImGUI头文件路径 function linkImGUI() externalincludedirs { "vendor/imgui", "vendor/imgui/backends" } end配置独立ImGUI静态库项目
在imgui项目中调用源文件添加函数:project "imgui" kind "StaticLib" language "C++" addImGUISources("opengl3", "glfw")配置主项目
主项目需同时链接库文件并引入头文件路径:project "MeuProjeto" -- 其他配置 useEigen() useViennaCL() useGLFW() useBoost('accumulators') links { "glad", "imgui" } linkImGUI() -- 添加此行引入头文件搜索路径
动态库额外注意事项
若要将ImGUI集成为动态库(SharedLib),需在ImGUI项目中添加符号导出定义:
- Windows平台:
defines { "IMGUI_API=__declspec(dllexport)" } - Linux/macOS平台:
defines { "IMGUI_API=__attribute__((visibility(\"default\")))" }
内容的提问来源于stack exchange,提问作者Francisco Ossian
相关产品推荐
相关产品推荐

