【问题标题】:No member named 'clock' in the global namespace when using FFmpeg pod使用 FFmpeg pod 时,全局命名空间中没有名为“clock”的成员
【发布时间】:2015-09-25 00:19:12
【问题描述】:

我的应用程序(iOS 7+,Xcode 6)使用 CocoaPods 作为其依赖项。其中一个依赖项是FFmpeg

当我构建我的应用程序时,我遇到了几个类似的问题,例如

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/ctime:60:9: 全局命名空间中没有名为“clock”的成员;你是说“羊群”吗?

我了解到这是因为 FFmpeg 在libavutil 子文件夹中包含time.h 文件。这个time.h 对编译器隐藏了系统time.h,从而隐藏了错误。

我尝试手动将 FFmpeg 的 time.h 重命名为其他名称,这会有所帮助。现在我想自动地做到这一点,并且以一种能够在下一次“pod update”中存活的方式。

我尝试将 libavutil 添加到 Sub-Directories to Exclude In Recursive Searches,但这根本没有帮助。

我尝试从Header Search Paths 中删除“${PODS_ROOT}/Headers/Public/FFmpeg/libavutil”,但也没有帮助。

我知道有 prepare_commandpost_install 钩子可以在他的 Podfile 中使用,但不幸的是我不知道这些对我的情况是否有帮助。

那么,如何将 FFmpeg pod 的 libavutil 中的 time.h 从标头搜索路径中排除(我不介意重命名甚至删除 time.h)?

【问题讨论】:

    标签: ios xcode ffmpeg cocoapods


    【解决方案1】:

    对于与ffmpeg的time.h有相同问题的人:

    你可以搜索系统的time.h并手动将其包含在ffmpeg的time.h中:

    打开ffmpeg的time.h(在libavutil中)并在开头插入#include </usr/include/time.h>

    当然,这只是一种懒惰的解决方法,但它是一种包含 time.h 标头的简单方法。

    【讨论】:

    • 对于那些安装了 Xcode 并且没有在提到的路径中找到 time.h 标头的人,正确的包含可能是:#include /Xcode.app/Contents/Developer/Platforms/MacOSX .platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/time.h>
    • 我不知道为什么,但我不得不在 /usr/local/include/time.h 中添加#include </usr/include/time.h>
    【解决方案2】:

    我会建议另一种解决方案,因为提供的解决方案对我来说并不完全有效。什么对我有用:

    1. 将 libavutil/time.h 重命名为 libavutil/fftime.h
    2. 在此文件中添加一行(靠近其他包含)#include <time.h>

    我认为这是一个更可靠和弹性的解决方案,即使它需要对 ffmpeg 的标头进行更多更改。将针对多个项目测试此解决方案。

    干杯,张

    【讨论】:

      【解决方案3】:

      如果您不使用此文件中的函数,例如:av_gettime、av_gettime_relative、av_gettime_relative_is_monotonic、av_usleep,您可以将 FFmpeg 的 time.h 从您的 Podfile 中的 pod 的公共标头中排除。

      Podfile:

      target 'YourApp' do
          project 'YourApp'
          ...
          pod 'FFmpeg', '= 2.8.3'
      end
      
      pre_install do |installer|
        installer.pod_targets.each do |pod|
              # FFmpeg: Fix with <time.h>
              if pod.name == 'FFmpeg'
                  pod.file_accessors.each do |fa|
                      fa.spec.exclude_files = 'ffmpeg-ios-static-libs/include/**/time.h'
                  end
              end
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 2012-06-12
        • 1970-01-01
        相关资源
        最近更新 更多