博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修改Xcode配置并支持iPhone上dylib工程 实例
阅读量:6240 次
发布时间:2019-06-22

本文共 7714 字,大约阅读时间需要 25 分钟。

修改Xcode配置并支持iPhonedylib工程是本文要介绍的内容,逛坛子发现一篇好文章,与大家分享一下,先来看内容。此帖纯粹讨论怎样更改xcode配置来使其支持创建iphone上的dylib工程文件,不涉及任何其他破解话题!

测试机器:10.6 with Xcode3.2

最近在研究如何创建iphone上的dylib文件,google出来的都是toolchain的东西,使用makefile来编译的,像我这种习惯IDE的人来说非常之不爽,所以花了一天时间来破解了下Xcode来让它可以创建编译iphone上的dylib文件的工程。

简单说下分析思路吧

首先xcode支持创建iphone static libtary和Cocoa的dynamic linrary的工程,通过不同编译对比可以发现Xcode通过productType = "com.apple.product-type.library.dynamic";配置来确定工程类型的。

打开**.xcodeproj/project.pbxproj文件,搜索productType=定位,可以发现如下图所示的内容

[attachment=10545]

可以创建一个iphone的static工程把static改成dynamic编译看看,可以发现xcode提示不支持dynamic类型的工程,无法编译,那我们让他支持就好了。

我们需要修改以下文件

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneOSProductTypes.xcspec  /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneOSPackageTypes.xcspec  在iPhoneOSProductTypes.xcspec中添加下列片段  // Dynamic library      {   Type = ProductType;          Identifier = com.apple.product-type.library.dynamic;          Class = PBXStaticLibraryProductType;          Name = "Dynamic Library";          Description = "Dynamic library";          IconNamePrefix = "TargetLibrary";          DefaultTargetName = "Dynamic Library";          DefaultBuildProperties = {              FULL_PRODUCT_NAME = "$(EXECUTABLE_NAME)";              MACH_O_TYPE = "mh_dylib";              REZ_EXECUTABLE = YES;              EXECUTABLE_PREFIX = "";              EXECUTABLE_SUFFIX = ".$(EXECUTABLE_EXTENSION)";              EXECUTABLE_EXTENSION = "dylib";              PUBLIC_HEADERS_FOLDER_PATH = "/usr/local/include";              PRIVATE_HEADERS_FOLDER_PATH = "/usr/local/include";              INSTALL_PATH = "/usr/local/lib";              DYLIB_INSTALL_NAME_BASE = "$(INSTALL_PATH)";              LD_DYLIB_INSTALL_NAME = "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)";              DYLIB_COMPATIBILITY_VERSION = "1";              DYLIB_CURRENT_VERSION = "1";              FRAMEWORK_FLAG_PREFIX = "-framework";              LIBRARY_FLAG_PREFIX = "-l";              LIBRARY_FLAG_NOSPACE = YES;              STRIP_STYLE = "debugging";              GCC_INLINES_ARE_PRIVATE_EXTERN = YES;              CODE_SIGNING_ALLOWED = NO;          };          PackageTypes = (              com.apple.package-type.mach-o-library   // default          );      },  在iPhoneOSPackageTypes.xcspec中添加下列片段  // Mach-O dynamic library      {   Type = PackageType;          Identifier = com.apple.package-type.mach-o-library;          Name = "Mach-O Dynamic Library";          Description = "Mach-O dynamic library";          DefaultBuildSettings = {              EXECUTABLE_PREFIX = "";              EXECUTABLE_SUFFIX = ".dylib";              EXECUTABLE_NAME = "$(EXECUTABLE_PREFIX)$(PRODUCT_NAME)$(EXECUTABLE_VARIANT_SUFFIX)$(EXECUTABLE_SUFFIX)";              EXECUTABLE_PATH = "$(EXECUTABLE_NAME)";          };          ProductReference = {              FileType = compiled.mach-o.dylib;              Name = "$(EXECUTABLE_NAME)";              IsLaunchable = NO;          };      },

 

文件附上,可以直接下载替换,替换/修改前做好备份

[attachment=10546]

现在再编译应该不会提示工程不支持了,那么剩下的就是改变其编译选项了,就是libtool的参数问题。

我们需要修改下列文件

/Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/Libtool.xcspec  /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support. xcplugin/Contents/Resources/iPhoneLinkerOptions.xcspec  在Libtool.xcspec中添加下列片段  {   Identifier = com.apple.pbx.linkers.libtooldynamic;      Type = Linker;      Class = PBXLinkerSpecificationLibtool;      Name = "Libtool";      Description = "Create a dynamic library using Apple Mach-O Librarian (libtool)";      IsAbstract = Yes;       // This is an internal tool, so we keep it out of the user interface      BinaryFormats = (mach-o);      Architectures = (ppc, ppc7400, ppc7450, ppc970, ppc64, i386, x86_64);      CommandLine = "$(LIBTOOL) -dynamic -arch_only $(arch) -compatibility_version $(DYLIB_COMPATIBILITY_VERSION) -current_version $(DYLIB_CURRENT_VERSION) [options] [special-args] -o $(OutputPath)";      // 'special-args' includes the input files      RuleName = "Libtool $(OutputPath) $(variant) $(arch)";      ExecDescription = "Create Dynamic Library $(OutputPath:file)";      InputFileTypes = (          compiled.mach-o.objfile      );      Outputs = (  // We're a linker-like task, so we expect to be given an output path in 'OutputPath'.          "$(OutputPath)"      );      CommandOutputParser = XCGccCommandOutputParser;      Options = (  // LIBTOOL          {   Name = LIBTOOL;              Type = Path;              DefaultValue = "$(PLATFORM_DEVELOPER_BIN_DIR)/libtool";          },  // SDK          {   Name = SDKROOT;              Type = Path;              CommandLineFlag = "-syslibroot";              IsInputDependency = Yes;          },  // Search paths          {   Name = LIBRARY_SEARCH_PATHS;              Type = PathList;              FlattenRecursiveSearchPathsInValue = Yes;   // causes any paths that have a '/**' suffix to be replaced with matching paths              CommandLinePrefixFlag = "-L";          },  // Input file lists          {   Name = __INPUT_FILE_LIST_PATH__;              Type = Path;              DefaultValue = "$(LINK_FILE_LIST_$(variant)_$(arch))";      // this is set up for us as a read-only property              CommandLineFlag = "-filelist";              IsInputDependency = Yes;          },          {   Name = auxiliary_file_lists;              Type = PathList;              CommandLineFlag = "-filelist";              IsInputDependency = Yes;          },  // Various flags          {   Name = ALL_OTHER_LIBTOOLFLAGS;              Type = StringList;              DefaultValue = "$(LD_FLAGS) $(SECTORDER_FLAGS) $(OTHER_LDFLAGS) $(OTHER_LDFLAGS_$(variant))   $(OTHER_LDFLAGS_$(arch)) $(OTHER_LDFLAGS_$(variant)_$(arch)) $(OTHER_LIBTOOLFLAGS) $(OTHER_LIBTOOLFLAGS_$(variant)) $(OTHER_LIBTOOLFLAGS_$(arch)) $(OTHER_LIBTOOLFLAGS_$(variant)_$(arch)) $(PRODUCT_SPECIFIC_LIBTOOLFLAGS)";              CommandLinePrefixFlag = "";          },          {   Name = EXPORTED_SYMBOLS_FILE;              Type = Path;              Condition = "$(SEPARATE_SYMBOL_EDIT) == NO";              CommandLineFlag = "-exported_symbols_list";              IsInputDependency = Yes;          },          {   Name = UNEXPORTED_SYMBOLS_FILE;              Type = Path;              Condition = "$(SEPARATE_SYMBOL_EDIT) == NO";              CommandLineFlag = "-unexported_symbols_list";              IsInputDependency = Yes;          },          {   Name = AdditionalCommandLineArguments;              Type = StringList;              CommandLinePrefixFlag = "";          },          {   Name = MACOSX_DEPLOYMENT_TARGET;              Type = String;              SetValueInEnvironmentVariable = "MACOSX_DEPLOYMENT_TARGET";          },      );  },

在iPhoneLinkerOptions.xcspec中搜索

BasedOn = "default:com.apple.pbx.linkers.libtool";

替换成

BasedOn = "default:com.apple.pbx.linkers.libtooldynamic";

这样修改后编译iphone的library工程师都会使用dynamic的参数来编译,

注意:如果要编译iphone static library这里需要将libtooldynamic修改回libtool并重启Xcode(唯一的小缺陷,应该可以通过hook xcode编译设置函数来动态修改,很麻烦,需要很多时间去找到相应的方法,找了一会儿就没高兴继续,先将就用吧)

做好以上工作后就可以创建并编译iphone上dynamic library的工程了。

这里附上工程和target模板文件

[attachment=10547]

解压此zip得到Cocoa Touch Dynamic Library文件夹,将其放到

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Library/下面  [attachment=10548]

 

解压此zip得到Dynamic Library.trgttmpl文件,将其放到

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Target Templates/Cocoa Touch/下面

重启Xcode就可以看到了,如图

[attachment=10549]  [attachment=10550]

测试结果

[attachment=10551]

使用otool查看编译出来的dylib文件

[attachment=10552]

成功!

谨记!!!!!需要修改文件来切换回编译static library!!!

小结:关于修改Xcode配置并支持iPhonedylib工程的内容介绍完了,希望本文对你有所帮助,更多相关内容请参考便捷而推荐。

转载地址:http://rvbia.baihongyu.com/

你可能感兴趣的文章
2.6 The Object Model -- Bindings
查看>>
2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)...
查看>>
二叉树问题(区间DP好题)
查看>>
PHP基础
查看>>
PHP奇淫技巧
查看>>
Centos中配置环境变量
查看>>
mysql中判断记录是否存在方法比较【转】
查看>>
HBase 列族的概念
查看>>
hdu2036
查看>>
基于模板匹配的马赛克检验
查看>>
Database4.exe用来导入excel
查看>>
Unable to preventDefault inside passive event listener
查看>>
java中string和int互相转化 (转)
查看>>
[LUOGU] P1220 关路灯
查看>>
【转】在控制台、WinForm项目中的嵌入mdf文件的烦恼
查看>>
【转】C51中断函数的写法
查看>>
django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)
查看>>
windows 2008 启用.NET Framework 3.5
查看>>
Linux -- Ubuntu搭建java开发环境
查看>>
MVC视图中Html常见的辅助方法
查看>>