随笔 - 0  文章 - 1  trackbacks - 0
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿

文章分类

文章档案

搜索

  •  

最新评论

在学习FFMPEG的过程中遇到了SDL,但将SDL头文件引入ios项目的时候,发现找不到头文件 -_-!SDL加入项目是需要通用库和头文件的。
我现在的需求是一个能适配iPhone4以上机型和模拟器的通用库。
别急,先回忆一下各个机型和arm体系结构的关系:
Armv6 --- iPhone3G (都老掉牙了,亲~)
Armv7 --- iPhone3GS/4 or iPad
Armv7s --- iPhone5
Simulator --- i386(这个就不属于arm体系了)

对于打库之类的神马,我个人觉得比较麻烦,网上版本很多,解释具体原因的却很少,而且很多资料都过时了,不适应现在的需求。
不过你如果感兴趣,了解一下也是很好的,这里有一篇老外的比较新的blog:《How to prepare your mac for ios development with ffmpeg libraries》,
详细告诉了我们在打静态通用库(XXX.a)的步骤,就只有一个Perl脚本,算是比较基础的了。你可以从中看到一些配置项,对你以后理解各种脚本是有好处的。
这里有两个链接:
1. https://bitbucket.org/DavidLudwig/sdl/src/a325f77bae36?at=default
2. https://github.com/manifest/sdl-ios-framework

第一个链接我还没尝试过,好像是一个shell脚本,用来生成所需的通用库和头文件的。
我主要是尝试的第二个脚本,貌似是用Python写的,很好理解,只是我对其中的各种环境变量比较生疏。

贴上执行脚本的readme,说的是执行脚本的前提条件,链接里也能找到:

Depends on

tools, you could install them with homebrew   brew install hg

  • hg
  • git
  • svn

rubygems, you could install them with sudo gem install colorize

  • colorize

What frameworks are available?

  • SDL
  • SDL_image
  • SDL_mixer
  • Tremor

How to use?

rake or rake SDL :build to download sources and build SDL.framework

rake build_all   :to download and install all available frameworks


仔细看了一下,发现这个脚本只是用来生成适配Armv7和Simulator的通用库,可是我还需要匹配Armv7s。
没办法,硬着头皮改了一下吧。
经过一遍又一遍的尝试,终于被我改好了,附上rakefile文件
------------------------------------------------------------------------------
# Builds a SDL framework 
for the iOS
# Copyright (c) 
2011-2012 Andrei Nesterov
# See LICENSE 
for licensing information
------------------------------------------------------------------------------
#
# Creates a pseudo
-framework which could be used to build iOS applications for
# both simulator and device
#
------------------------------------------------------------------------------
#
# Depends on tools:
#  hg
#  git
#  svn
#
# Depends on rubygems:
#  colorize
#
------------------------------------------------------------------------------
#
# To configure the script, define:
#   Conf              configuration (:release or :debug)
#   Arch1              architecture 
for the device's library (e.g. :armv7)
#   Arch2              architecture for the device's library (e.g. :armv7s)
#   SDK               version number of the iOS SDK (e.g. "4.3")
#
------------------------------------------------------------------------------

require 
'rubygems'
require 
'colorize'
require 
'find'

--- Configure ----------------------------------------------------------------
module Configure
     Conf 
= :release
     Arch1 
= :armv7
     Arch2 
= :armv7s
     SDK 
= '6.1'
end

--- Constants ----------------------------------------------------------------
module Global
     RootDir 
= Dir.pwd
     TemplatesDir 
= "#{RootDir}/templates"
     SourcesDir 
= "#{RootDir}/src"
     BuildDir 
= "#{RootDir}/build"
end

--- Common -------------------------------------------------------------------
def message(text)
     tailSize 
= 75 - text.length;
     puts 
"\n>>> #{text} #{'-' * (tailSize < 0 ? 0 : tailSize)}".green
end

def refresystem_dir(path)
     system 
%{ rm -rf #{path} } if FileTest.exists? path
     system 
%{ mkdir -p #{path} }
end

module Builder
     def build_library(project, dest, target, conf, sdk, arch)
          dest 
= library_bundle_path(dest, conf, sdk, arch)
          sdk, arch 
= compute_platform(sdk, arch)

          args 
= []
          args 
<< %{-sdk "#{sdk}"}
          args 
<< %{-configuration "#{conf}"}
          args 
<< %{-target "#{target}"}
          args 
<< %{-arch "#{arch.to_str}"}
          args 
<< %{-project "#{project}"}
          args 
<< %{TARGETED_DEVICE_FAMILY="1,2"}
          args 
<< %{BUILT_PRODUCTS_DIR="build"}
          args 
<< %{CONFIGURATION_BUILD_DIR="#{dest}"}
          args 
<< %{CONFIGURATION_TEMP_DIR="#{dest}.build"}

          refresystem_dir dest
          Dir.chdir File.dirname(project) 
do
               system 
%{xcodebuild #{args.join " "}}
          end
     end

     def build_framework_library(frameworkLib, deviceLib1, deviceLib2, simulatorLib)
          refresystem_dir(File.dirname(frameworkLib))
          system 
%{lipo -create #{deviceLib1} #{deviceLib2} #{simulatorLib} -o #{frameworkLib}}
     end

     def build_framework(name, version, identifier, dest, headers, project, target, conf, sdk, arch1, arch2)
          build_library(project, dest, target, conf, sdk, arch1);
          build_library(project, dest, target, conf, sdk, arch2);
          build_library(project, dest, target, conf, sdk, :i386);

          libFileName 
= nil
          Find.find(library_bundle_path(dest, conf, sdk, arch1)) 
do |path|
               libFileName 
= File.basename(path) if path =~ /\A.*\.a\z/
          end
          Find.find(library_bundle_path(dest, conf, sdk, arch2)) 
do |path|
               libFileName 
= File.basename(path) if path =~ /\A.*\.a\z/
          end
          libFilePath 
= "#{dest}/universal-#{conf}/#{libFileName}"

          build_framework_library(
               libFilePath,
               
"#{library_bundle_path(dest, conf, sdk, arch1)}/#{libFileName}",
               
"#{library_bundle_path(dest, conf, sdk, arch2)}/#{libFileName}",
               
"#{library_bundle_path(dest, conf, sdk, :i386)}/#{libFileName}"
          )
          create_framework(name, version, identifier, dest, headers, libFilePath)
     end

     def create_framework(name, version, identifier, dest, headers, lib)
          frameworkVersion 
= "A"
          frameworkBundle 
= framework_bundle_path(dest, name)

          # creating framework
's directories    
          refresystem_dir frameworkBundle
          system 
%{ mkdir "#{frameworkBundle}/Versions" }
          system 
%{ mkdir "#{frameworkBundle}/Versions/#{frameworkVersion}" }
          system 
%{ mkdir "#{frameworkBundle}/Versions/#{frameworkVersion}/Resources" }
          system 
%{ mkdir "#{frameworkBundle}/Versions/#{frameworkVersion}/Headers" }
          system 
%{ mkdir "#{frameworkBundle}/Versions/#{frameworkVersion}/Documentation" }

          # creating framework
's symlinks
          system %{ ln -"#{frameworkVersion}" "#{frameworkBundle}/Versions/Current" }
          system 
%{ ln -"Versions/Current/Headers" "#{frameworkBundle}/Headers" }
          system 
%{ ln -"Versions/Current/Resources" "#{frameworkBundle}/Resources" }
          system 
%{ ln -"Versions/Current/Documentation" "#{frameworkBundle}/Documentation" }
          system 
%{ ln -"Versions/Current/#{File.basename lib}" "#{frameworkBundle}/#{name}" }

          # copying lib
          system 
%{ cp "#{lib}" "#{frameworkBundle}/Versions/#{frameworkVersion}" }

          # copying includes
          FileList[
"#{headers}/*.h"].each do |source|
               system 
%{ cp "#{source}" "#{frameworkBundle}/Headers" }
          end

          # creating plist
          File.open(
"#{frameworkBundle}/Resources/Info.plist""w"do |f|
               f.puts 
'<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">'
               f.puts "<dict>
     <key>CFBundleDevelopmentRegion</key>
     
<string>Englisystem</string>
     
<key>CFBundleExecutable</key>
     
<string>#{name}</string>
     
<key>CFBundleIdentifier</key>
     
<string>#{identifier}</string>
     
<key>CFBundleInfoDictionaryVersion</key>
     
<string>6.0</string>
     
<key>CFBundlePackageType</key>
     
<string>FMWK</string>
     
<key>CFBundleSignature</key>
     
<string>????</string>
     
<key>CFBundleVersion</key>
     
<string>#{version}</string>
</dict>
</plist>"
          end
     end

     def library_bundle_path(path, conf, sdk, arch)
          sdk, arch 
= compute_platform(sdk, arch)
          
"#{path}/#{sdk}-#{arch}-#{conf}"
     end

     def framework_bundle_path(path, name)
          
"#{path}/#{name}.framework"
     end

     def compute_platform(sdk, arch)
          
return [sdk, arch] if arch.class == String
          [arch 
== :i386 ? "iphonesimulator" + sdk : "iphoneos" + sdk, arch.to_s]
     end

     
private :library_bundle_path, :framework_bundle_path, :compute_platform
end

--- Package ------------------------------------------------------------------
class Package
     extend Builder

     def self.build(conf, sdk, arch1, arch2)
          download
          unpack
          install(config(conf), sdk, arch1, arch2)
     end

     def self.unpack
     end

     def self.config conf
          conf 
== :release ? "Release" : "Debug"
     end
end

--- SDL ----------------------------------------------------------------------
class SDL < Package
     ProjFile 
= "SDL.xcodeproj"
     SourcesDir 
= (FileTest.exists? ProjFile) ? "#{Global::RootDir}/../.." : "#{Global::SourcesDir}/SDL"
     BuildDir 
= "#{Global::BuildDir}/sdl"
     Version 
= "2.0"

     def self.download
          message 
"downloading SDL"
          system 
%{hg clone "http://hg.libsdl.org/SDL" "#{SourcesDir}"}
     end
    
     def self.install(conf, sdk, arch1, arch2)
          message 
"building SDL"
          self.build_framework(
               
"SDL",
               Version,
               
"org.libsdl",
               BuildDir,
               
"#{SourcesDir}/include",
               
"#{SourcesDir}/Xcode-iOS/SDL/#{ProjFile}",
               
"libSDL",
               conf,
               sdk,
               arch1,
               arch2
          )
     end
end

--- SDL_image ----------------------------------------------------------------
class SDL_image < Package
     SourcesDir 
= "#{Global::SourcesDir}/sdl_image"
     BuildDir 
= "#{Global::BuildDir}/sdl_image"
     Version 
= "1.2.12"
 
     def self.download
          message 
"downloading SDL_image"
          system 
%{hg clone "http://hg.libsdl.org/SDL_image" "#{SourcesDir}"}
     end
    
     def self.install(conf, sdk, arch1, arch2)
          message 
"building SDL_image"
          self.build_framework(
               
"SDL_image",
               Version,
               
"org.libsdl",
               BuildDir,
               
"#{SourcesDir}",
               
"#{SourcesDir}/Xcode-iOS/SDL_image.xcodeproj",
               
"libSDL_image",
               conf,
               sdk,
               arch1,
               arch2
          )
     end
end

--- SDL_mixer ----------------------------------------------------------------
class SDL_mixer < Package
     SourcesDir 
= "#{Global::SourcesDir}/sdl_mixer"
     BuildDir 
= "#{Global::BuildDir}/sdl_mixer"
     Version 
= "1.2.12"

     def self.download
          message 
"downloading SDL_mixer"
          system 
%{hg clone "http://hg.libsdl.org/SDL_mixer" "#{SourcesDir}"}
     end
    
     def self.install(conf, sdk, arch1, arch2)
          message 
"creating links on vorbis headers for successful SDL_mixer building"
          refresystem_dir(headersDir 
= "#{Global::SourcesDir}/libtremor")
          system 
%{ ln -"#{Tremor::BuildDir}/vorbis.framework/Headers" "#{headersDir}/ogg" }
          system 
%{ ln -"#{Tremor::BuildDir}/vorbis.framework/Headers" "#{headersDir}/tremor" }

          message 
"building SDL_mixer"
          self.build_framework(
               
"SDL_mixer",
               Version,
               
"org.libsdl",
               BuildDir,
               
"#{SourcesDir}",
               
"#{SourcesDir}/Xcode-iOS/SDL_mixer.xcodeproj",
               
"Static Library",
               conf,
               sdk,
               arch1,
               arch2
          )

          system 
%{ rm -rf #{headersDir} }
     end
end

--- Tremor -------------------------------------------------------------------
class Tremor < Package
     SourcesDir 
= "#{Global::SourcesDir}/cocos2d"
     BuildDir 
= "#{Global::BuildDir}/tremor"
     Version 
= "1.3.2"

     def self.download
          message 
"downloading Cocos2d"
          system 
%{git clone "https://github.com/cocos2d/cocos2d-iphone.git" "#{SourcesDir}"}
     end
    
     def self.install(conf, sdk, arch1, arch2)
          message 
"switching to v1.x brunch"
          Dir.chdir(SourcesDir) 
do
               system 
'git checkout master'
          end

          message 
"building Tremor"
          self.build_framework(
               
"vorbis",
               Version,
               
"org.xiph",
               BuildDir,
               
"#{SourcesDir}/external/Tremor",
               
"#{SourcesDir}/cocos2d-ios.xcodeproj",
               
"vorbis",
               conf,
               sdk,
               arch1,
               arch2
          )
     end
end

--- Tasks --------------------------------------------------------------------
require 
'rake/clean'

Libs 
= [:SDL, :SDL_image, :Tremor, :SDL_mixer]

desc 
"Download sources and build SDL.framework"
task :
default => ["SDL:build"do
end

desc 
"Download sources and build all targets [#{Libs.join ""}]"
task :build_all 
do
     Libs.each 
do |classname|
          Object.const_get(classname).build Configure::Conf, Configure::SDK, Configure::Arch1, Configure::Arch2
     end
end

Libs.each 
do |classname|
     
namespace classname do
          obj 
= Object.const_get(classname)

          desc 
"Download sources and build #{classname}.framework"
          task :build 
do
               obj.build Configure::Conf, Configure::SDK, Configure::Arch1, Configure::Arch2
          end

          desc 
"Only download #{classname} sources"
          task :download 
do
               obj.download
               obj.unpack
          end

          desc 
"Only build #{classname}.framework"
          task :install 
do
               obj.install Configure::Conf, Configure::SDK, Configure::Arch1, Configure::Arch2
          end

          desc 
"Remove all files associated with #{classname}"
          task :clobber 
do
               CLOBBER 
= Rake::FileList.new
               CLOBBER.include obj::SourcesDir, obj::BuildDir
               Rake::Task[:clobber].execute
          end
     end
end

CLOBBER.include Global::SourcesDir, Global::BuildDir
一切都是自动化安装,
稍微注意一下的是自己的sdk版本,我的是6.1。
还有最后一个小问题,SDL需要4个framework支持:
CoreGraphics
QuartzCore
OpenGLES
AudioToolbox
所以ios项目也要对应的引入这4个framework。
posted on 2013-07-30 17:39 Long 阅读(7410) 评论(0)  编辑 收藏 引用 所属分类: iOS

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理