1

我有一个“跨平台”应用程序,目前使用两个代码存储库,相对独立地维护,并根据目标平台(分别为 win 或 mac)使用 VS / Xcode 构建。在之前的几个项目中使用 Premake 后,我爱上了它,并试图将我用于此应用程序的所有代码整合到一个可交叉编译的代码库中。

我不想依赖 Xcode,而是希望任何开发人员都能够使用 Xcode 或 gmake 在 Mac 上构建。我有一个非标准框架,我想链接并包含在存储库中(它不会位于 /Library/Frameworks 或任何默认的 mac 框架搜索路径中)。我已在项目的目录中添加了框架文件/lib/TheFramework.framework。我的 premake 文件在项目定义下包含以下内容:

    includedirs {".", "lib", "lib/TheFramework.framework/Headers"}
    libdirs {"lib"}
    links {"TheFramework.framework"}

当我编译时,(运行$ premake5 gmake然后$ make),我得到一个头文件未找到错误。我的搜索路径有问题吗?我在某处缺少路径或标志吗?

谢谢!

4

1 回答 1

2

在查看您需要使用 premake 做什么之前,让我们先看看需要在引擎盖下发生什么。

在 gcc 或 clang 上使用非标准框架编译 mac 程序时(这是生成的 make 文件所做的),有必要做两件事:

  1. 指定框架的名称,通过-framework TheFramework- 这是 premake 在你提供它时所做的links {"TheFramework.framework"
  2. 指定框架的位置,通过-F /Path/To/Framework/- premake 目前不会自动处理。

我制作了一个使用 SDL2 框架并使用 gcc 编译的简单测试 c 程序:https ://gist.github.com/JohannesMP/6ff3463482ebbdc82c2e - 请注意,当我离开-F /...标志时,我会收到一个可能类似的错误对你所描述的。


所以发生的事情是,尽管您提供了包含目录的 premake,但 premake 不会添加正确的-F标志。

解决此问题的一种方法是执行以下操作:

configuration {"macosx", "gmake"}
    buildoptions {"-F /Path/To/Framework"}
    linkoptions {"-F /Path/To/Framework"}

(参见这里的示例项目:https ://gist.github.com/JohannesMP/9a9b5263c127103f1861#file-premake5-lua-L24-L26 )

在 premake5 中,这将盲目地将提供的代码附加到构建步骤和链接步骤。有必要为构建和链接都这样做。

请记住,由于 premake 不会处理或检查构建/链接选项是否有效,如果提供的路径在他们的机器上不存在,用户将收到错误消息。例如,虽然您的用户特定目录中可能有一个框架~/Library/Frameworks,但由于默认情况下该文件夹不存在,另一个用户可能正在使用全局/Library/Frameworks,并且当他们尝试使用 gmake 编译您的 premake 项目时,他们会收到警告:

ld: warning: directory not found for option '-F/Users/<NAME>/Library/Frameworks'

在这一点上,似乎没有“安全”的方式让 premake5 尝试包含框架路径,但这可能会在未来发生变化。

查看我在 premake repo 上发布的这个问题:https ://github.com/premake/premake-core/issues/196

于 2015-08-04T21:22:49.883 回答