6

我的module.modulemap文件如下所示:

module CompanyInternalSDK {
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}

但是,我收到此错误:

/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
           ^

当我使用不带波浪号的绝对路径时,它编译得很好,但是由于这将像这样分发给所有开发人员,我想使用波浪号。有什么方法可以使这项工作正常进行吗?


我还尝试在header字符串中使用环境变量,但这也不起作用:

module CompanyInternalSDK {
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
    export *
}
/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h"
           ^
4

1 回答 1

4

不,modulemap 语法不会扩展波浪号或环境变量。它最终只是期望stat你给它的路径,如果那里没有文件,它会抱怨。

  • 是在模块映射文件的词法分析期间开始头文件查找的地方。
  • 它最终将路径传递给 SourceManager 的 FileManager 以生成一个File对象,就像这里的框架Headers/公共头文件夹中的头一样。
  • getFile最终调用 to getStatValue,它会进行缓存查找。
  • FileSystemStatCache::get最终在 LLVM 的文件系统抽象中出现,它调用,sys::fs::status它被记录为类似于 POSIX stat
  • POSIXstat可以按原样使用路径,没有波浪号或环境变量扩展——这些路径的常见可用性是由于 shell 可以帮助您,而不是大多数时间在系统级别自动发生的事情。

但是,在模块映射中使用相对路径是标准的。词法分析器尊重这一点,所有模块映射文档都证明了这一点。在您的模块映射文件与您的库位于同一位置并安装在它旁边的常见情况下,这应该足以正确解析路径。

于 2017-05-10T15:12:40.173 回答