You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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。第三个“同样无法编译的配置”疑似复制笔误,但核心问题一致。

解决步骤

  1. 拆分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
    
  2. 配置独立ImGUI静态库项目
    在imgui项目中调用源文件添加函数:

    project "imgui"
        kind "StaticLib"
        language "C++"
        addImGUISources("opengl3", "glfw")
    
  3. 配置主项目
    主项目需同时链接库文件并引入头文件路径:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:06:05