将静态库嵌入静态库的 Premake 指令
Premake directive to embed a static library into a static library
首先,我使用的是 premake5 和 VisualStudio 2013。请不要因为那个而跳到我身上(因为 premake5 仍然是 alpha)。我已经搜索过但找不到答案,不是真正有效的答案。
我需要使用 premake 将静态库嵌入到自定义静态库中。我在更新库后转换一些旧代码,只想 link 自定义库与应用程序。我不想 link 自定义库和它处理的所有其他库都用于应用程序配置。 premake5 的其他所有功能都运行良好。
我可以使用 link 指令将其发送到 link 应用程序,例如:
links { "SDL2", "SDL2main", "SDL2_image" }
这对于正常包含静态库来说效果很好,但我需要一种方法将这些示例库嵌入到自定义静态库中。
我可以将 premake 创建的结果项目文件放入 visual studio 并手动修改项目以按照我需要的方式添加库,但我不想每次都这样做需要重新生成项目。
我需要的结果是 premake 将以下 XML 生成到项目 xml 文件中的方法:
<ItemGroup>
<Library Include="..\deps\SDL2\lib\x86\SDL2.lib">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
<Library Include="..\deps\SDL2\lib\x86\SDL2main.lib">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
<Library Include="..\deps\SDL2_image\lib\x86\SDL2_image.lib" />
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
</ItemGroup>
这是在 visual studio 中手动编辑项目的结果。我从 x64 构建中添加了库的排除,因为最终,我也必须使用这些库的 x64 版本。如果我严重忽略了一些东西,那就太好了,但我需要能够让它发挥作用。
我是不是忽略了一些很简单的东西?
Premake 不支持立即将静态库链接在一起,因为该行为不可移植到其他工具集。但是,您可以在项目脚本中安装一个小扩展以使其工作:
---
-- Allow static library projects to link in their dependencies. Visual Studio
-- doesn't support this out of the box, so I need to manually add items to
-- the list of additional dependencies.
---
local p = premake
function myAdditionalStaticDependencies(cfg)
local links = p.config.getlinks(cfg, "siblings", "fullpath")
if #links > 0 then
links = path.translate(table.concat(links, ";"))
p.x('<AdditionalDependencies>%s;%%(AdditionalDependencies)</AdditionalDependencies>', links)
end
end
p.override(p.vstudio.vc2010.elements, "lib", function(base, cfg, explicit)
local calls = base(cfg, explicit)
if cfg.kind == p.STATICLIB then
table.insert(calls, myAdditionalStaticDependencies)
end
return calls
end)
首先,我使用的是 premake5 和 VisualStudio 2013。请不要因为那个而跳到我身上(因为 premake5 仍然是 alpha)。我已经搜索过但找不到答案,不是真正有效的答案。
我需要使用 premake 将静态库嵌入到自定义静态库中。我在更新库后转换一些旧代码,只想 link 自定义库与应用程序。我不想 link 自定义库和它处理的所有其他库都用于应用程序配置。 premake5 的其他所有功能都运行良好。
我可以使用 link 指令将其发送到 link 应用程序,例如: links { "SDL2", "SDL2main", "SDL2_image" }
这对于正常包含静态库来说效果很好,但我需要一种方法将这些示例库嵌入到自定义静态库中。
我可以将 premake 创建的结果项目文件放入 visual studio 并手动修改项目以按照我需要的方式添加库,但我不想每次都这样做需要重新生成项目。
我需要的结果是 premake 将以下 XML 生成到项目 xml 文件中的方法:
<ItemGroup>
<Library Include="..\deps\SDL2\lib\x86\SDL2.lib">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
<Library Include="..\deps\SDL2\lib\x86\SDL2main.lib">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
<Library Include="..\deps\SDL2_image\lib\x86\SDL2_image.lib" />
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug Win64|x64'">true</ExcludedFromBuild>
</Library>
</ItemGroup>
这是在 visual studio 中手动编辑项目的结果。我从 x64 构建中添加了库的排除,因为最终,我也必须使用这些库的 x64 版本。如果我严重忽略了一些东西,那就太好了,但我需要能够让它发挥作用。
我是不是忽略了一些很简单的东西?
Premake 不支持立即将静态库链接在一起,因为该行为不可移植到其他工具集。但是,您可以在项目脚本中安装一个小扩展以使其工作:
---
-- Allow static library projects to link in their dependencies. Visual Studio
-- doesn't support this out of the box, so I need to manually add items to
-- the list of additional dependencies.
---
local p = premake
function myAdditionalStaticDependencies(cfg)
local links = p.config.getlinks(cfg, "siblings", "fullpath")
if #links > 0 then
links = path.translate(table.concat(links, ";"))
p.x('<AdditionalDependencies>%s;%%(AdditionalDependencies)</AdditionalDependencies>', links)
end
end
p.override(p.vstudio.vc2010.elements, "lib", function(base, cfg, explicit)
local calls = base(cfg, explicit)
if cfg.kind == p.STATICLIB then
table.insert(calls, myAdditionalStaticDependencies)
end
return calls
end)