如何使用Premake构建CMake项目并集成CMake C++库(链接、包含等)?
使用Premake构建CMake项目并集成CMake C++库
核心思路
Premake本身不直接解析CMakeLists.txt,但可以通过调用CMake生成构建文件并执行编译,将CMake项目作为外部依赖纳入Premake工作流;对于CMake编译出的库,只需在Premake中指定头文件路径、链接库文件,并确保构建顺序即可完成集成。
分步实现
1. 用Premake管理CMake项目的构建
在premake5.lua中通过externalproject定义CMake项目,指定CMake编译命令:
-- 定义CMake依赖库 externalproject "MyCMakeStaticLib" location "vendor/MyCMakeLib" -- CMake项目根目录 kind "StaticLib" -- 匹配CMake库的类型(StaticLib/DLL) language "C++" -- 调用CMake生成并编译项目 buildcommands { -- 同步Premake与CMake的构建配置 "cmake -S . -B build -DCMAKE_BUILD_TYPE=%{cfg.buildcfg}", "cmake --build build --config %{cfg.buildcfg}" } -- 指定CMake生成的库文件输出路径 targetdir "vendor/MyCMakeLib/build/%{cfg.buildcfg}" targetname "MyCMakeStaticLib" -- 匹配CMake项目生成的库名称
2. 在主项目中集成CMake库
在主Premake项目中添加头文件包含、库链接,并设置依赖关系:
workspace "MyMainProject" configurations { "Debug", "Release" } language "C++" cppdialect "C++17" project "MyConsoleApp" kind "ConsoleApp" files { "src/**.cpp", "src/**.h" } -- 包含CMake库的头文件目录 includedirs { "vendor/MyCMakeLib/include" } -- 链接CMake编译生成的库 links { "MyCMakeStaticLib" } -- 确保先编译CMake依赖库,再编译主项目 dependson { "MyCMakeStaticLib" }
关键注意事项
- 确保Premake的
configurations(Debug/Release)与CMake的CMAKE_BUILD_TYPE完全对应,避免编译产物不匹配。 - 如果是动态库(DLL),需通过
postbuildcommands复制DLL到主程序输出目录:postbuildcommands { "copy /Y \"vendor/MyCMakeLib/build/%{cfg.buildcfg}/MyCMakeDLL.dll\" \"%{cfg.targetdir}\"" } - Windows平台可动态指定CMake生成器(如Visual Studio版本):
local cmake_gen = os.target() == "windows" and '-G "Visual Studio 17 2022"' or "" buildcommands { string.format("cmake -S . -B build %s -DCMAKE_BUILD_TYPE=%%{cfg.buildcfg}", cmake_gen), "cmake --build build --config %{cfg.buildcfg}" }
简便易用的简化方案
将CMake库集成逻辑封装为可复用Lua函数,避免重复代码:
-- 封装CMake库集成函数 function add_cmake_dependency(lib_name, lib_root_dir, include_dir) -- 定义外部CMake项目 externalproject(lib_name) location(lib_root_dir) kind "StaticLib" language "C++" local cmake_gen = os.target() == "windows" and '-G "Visual Studio 17 2022"' or "" buildcommands { string.format("cmake -S . -B build %s -DCMAKE_BUILD_TYPE=%%{cfg.buildcfg}", cmake_gen), "cmake --build build --config %{cfg.buildcfg}" } targetdir(path.join(lib_root_dir, "build/%{cfg.buildcfg}")) targetname(lib_name) -- 自动为所有项目添加依赖、头文件和链接 filter "projects:*" includedirs { include_dir } links { lib_name } dependson { lib_name } end -- 一键集成CMake库 add_cmake_dependency( "MyCMakeLib", "vendor/MyCMakeLib", "vendor/MyCMakeLib/include" ) -- 主项目定义 workspace "MyMainProject" configurations { "Debug", "Release" } language "C++" project "MyApp" kind "ConsoleApp" files { "src/**.cpp" }
只需调用add_cmake_dependency传入核心参数,即可完成所有集成操作,适合多CMake依赖的项目。
内容的提问来源于stack exchange,提问作者ParhamTny
相关产品推荐
相关产品推荐

