使用Premake和GNU Make链接Mac框架

时间:2015-04-06 03:57:14

标签: xcode linker makefile g++ premake

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

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

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

当我编译时,(运行$ premake5 gmake然后$ make),我得到一个未找到头文件的错误。我的搜索路径有问题吗?我错过了某个地方的路径或旗帜吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在看看你需要做什么预制之前,让我们先来看看幕后需要做些什么。

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

  1. 通过-framework TheFramework指定框架的名称 - 这是premake在您提供links {"TheFramework.framework"时所做的事情
  2. 通过-F /Path/To/Framework/指定框架的位置 - 目前由premake自动处理。
  3. 我做了一个简单的测试c程序,它使用SDL2框架并用gcc编译它: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