如何编译objective-c源代码与clang在mingw64-x86通过apple libobjc.dll? [英] how to compile objective-c source code with clang in mingw64-x86 via apple libobjc.dll?

查看:597
本文介绍了如何编译objective-c源代码与clang在mingw64-x86通过apple libobjc.dll?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,当编译目标c源代码在windows平台上。
当然在Windows平台上编译目标c源代码,我们通常使用gnustep环境(gcc objecitve-c编译器。gnustep libojc动态库。gnustep基础框架...等等)。



但我想要一个干净的环境尝试编译器目标c,并使用不同的libobjc库。



因为mac os x 10.6。苹果移动macosx系统到x86平台(没有ppc支持),和可可技术的REWRITE系统应用程序包括iTunes。



和iTunes有Windows版本。 >

通过在安装iTunes.i后找到任何支持的dll文件搜索系统文件夹:
C:\Program Files(x86)\Common Files \Apple\Apple Application Support



顺便说一下,我的系统是windows 7 x86_64。



我发现它有:

  ApplePushService.dll 
AppleVersions.dll
APSDaemon_main.dll
ASL.dll
AVFoundationCF.dll
CFNetwork.dll
CoreAudioToolbox.dll
CoreFoundation.dll
CoreGraphics.dll
CoreMedia .dll
CoreText.dll
CoreVideo.dll
Foundation.dll
icudt46.dll
icuin40.dll
icuuc40.dll
JavaScriptCore。 dll
libcache.dll
libdispatch.dll
libicuin.dll
libicuuc.dll
libtidy.dll
libxml2.dll
libxslt.dll
MediaToolbox.dll
objc.dll
pthreadVC2.dll
QTMovieWin.dll
QuartzCore.dll
SQLite3.dll
VideoToolbox.dll
WebKit.dll
WebKitQuartzCoreAdditions.dll
YSCrashDump.dll
YSUtilities.dll
zlib1.dll

看起来像,苹果实现这些低级框架到Windows平台。

  CFNetwork.framework  - > CFNetwork.dll 

CoreGraphics.framework - > CoreGraphics.dll

Foundation.framework - > Foundation.dll

libobjc.a.dylib - > objc.dll

WebKit.framework - > WebKit.dll

所以,我认为使用苹果的libobjc发布版本更好



我想为目标c初学者(我的同学和i)建立一个学习环境。



所以我复制objc.dll并将其重命名为libobjc.dll



使用mingw工具pexportsexport libobjc.dll'def libobjc.def然后使用visual studio命令工具lib.exe将.def文件转换为libobjc.lib。



然后我下载




  • mingw64的x86(32位)编译器dng预编译包。

  • mingw64的clang + llvm(32位)编译器dng预编译包。

  • mingw64的msys环境预编译包。



将这3个包安装到系统。
然后将libobjc.dll,libobjc.lib复制到/ lib(在Windows平台上,.a和.lib使用相同的bin格式)。



一个示例objective-c源代码.code在这里:
file:test.m

  #import< stdio .h> 

@interface Foo {
int count;
}

+(void)fooWithBar;

@end

@implementation Foo

+(void)fooWithBar {
printf(abc);
}

@end


int main(){
[Foo fooWithBar];
return 0;
}

只需编译:



clang test.m



发生错误,然后使用-v选项显示详细信息:

  clang版本3.1(branches / release_31)
目标:i686-w64-mingw32
线程模型:posix
c:/mingw64w32/bin/clang.exe-cc1 -triple i686-w64-mingw32 -S -disable-free -main-file-name test.m -mrelocation-model static -mdisable-fp-elim -mconstructor -aliases -target-cpu pentium4 -target-linker-version 2.20.51.0.2 -momit-frame-pointer -v -resource-dirc:/mingw64w32/bin\\..\\lib \\clang\\3.1-fmodule-cache-pathC:/ Users / Joe / AppData / Local / Temp \\clang-module-cache-fno-dwarf-directory-asm -fdebug -compilation-dir C:/ MINGW64-X86-MSYS-20111123 / home / Joe -ferror-limit 19 -fmessage-length 0 -mstackrealign -fno-use-cxa-atexit -fgnu-runtime -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-fragile-abi -fobjc-exceptions -fdiagnostics-show-option -o C:/Users/Joe/AppData/Local/Temp/test-709512.s -x objective-c test .m
clang -cc1 3.1基于LLVM 3.1缺省目标i686-w64-mingw32
忽略不存在的目录/ usr / local / include
忽略不存在的目录c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../../ x86_64-w64-mingw32 / include
忽略不存在的目录/ mingw / include
忽略不存在的目录c :/ mingw / include
忽略不存在的目录/ usr / include
#include...搜索从这里开始:
#include< ...>搜索从这里开始:
c:/ mingw64w32 / bin /../ lib / clang / 3.1 / include
c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../ ./i686-w64-mingw32/include
c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../../ include
搜索列表的结尾。
c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe-v -c -o C:/Users/Joe/AppData/Local/Temp/test-709513.o -x汇编程序C :/Users/Joe/AppData/Local/Temp/test-709512.s
使用内置规格。
COLLECT_GCC = c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
目标:i686-w64-mingw32
配置为:/ home / drangon / work / mingw-w64 -dgn_32 / source / gcc / configure --host = i686-w64-mingw32 --target = i686-w64-mingw32 --disable-nls --enable-languages = c,c ++,objc,obj-c ++ --with- gmp = / home / drangon / work / mingw-w64-dgn_32 / build / for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix = / home / drangon / work / mingw- w64-dgn_32 / target --with-sysroot = / home / drangon / work / mingw-w64-dgn_32 / target
线程模型:win32
gcc version 4.7.2 20120823(prerelease)(GCC)
COLLECT_GCC_OPTIONS =' - v''-c''-o''C:/Users/Joe/AppData/Local/Temp/test-709513.o''-mtune = generic''-march = pentiumpro'
c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /../../../../ i686-w64-mingw32 / bin / as.exe - v -o C:/Users/Joe/AppData/Local/Temp/test-709513.o C:/Users/Joe/AppData/Local/Temp/test-709512.s
GNU汇编器版本2.23.51(使用BFD版本(GNU Binutils)2.23.51.20120823
COMPILER_PATH = c:/ mingw64w32 / bin /../ libexec / gcc / i686-w64-mingw32 / 4.7.2 /; c:/ i686-w64-mingw32) mingw64w32 / bin /../libexec/gcc/; c:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32 / 4.7.2 /../../../../i686- w64-mingw32 / bin /
LIBRARY_PATH = c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /; c:/ mingw64w32 / bin /../ lib / gcc /;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib /;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../lib/;c:/mingw64w32/bin/ .. /lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/;c:/mingw64w32/bin/../lib/gcc/ i686-w64-mingw32 / 4.7.2 /../../../
COLLECT_GCC_OPTIONS =' - v''-c''-o''C:/ Users / Joe / AppData / Local / Temp /test-709513.o''-mtune = generic''-march = pentiumpro'
c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe-v -o a.out C: /Users/Joe/AppData/Local/Temp/test-709513.o
使用内置规格。
COLLECT_GCC = c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
COLLECT_LTO_WRAPPER = c:/ mingw64w32 / bin /../ libexec / gcc / i686-w64-mingw32 / 4.7。 2 / lto-wrapper.exe
目标:i686-w64-mingw32
配置为:/ home / drangon / work / mingw-w64-dgn_32 / source / gcc / configure --host = i686-w64 -mingw32 --target = i686-w64-mingw32 --disable-nls --enable-languages = c,c ++,objc,obj-c ++ --with-gmp = / home / drangon / work / mingw-w64-dgn_32 / build / for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix = / home / drangon / work / mingw-w64-dgn_32 / target --with-sysroot = / home / drangon / work / mingw-w64-dgn_32 / target
线程模型:win32
gcc版本4.7.2 20120823(prerelease)(gCC)
COMPILER_PATH = c:/ mingw64w32 / bin /../ libexec / gcc / i686-w64-mingw32 / 4.7.2 /; c:/ mingw64w32 / bin /../libexec/gcc/c:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32/ 4.7.2 /../../../../ i686-w64-mingw32 / bin /
LIBRARY_PATH = c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /; c:/ mingw64w32 / bin /../lib/gcc/; c:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32 / 4.7.2 /../../ ../../i686-w64-mingw32/lib/../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../ ../../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32 /lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../
COLLECT_GCC_OPTIONS =' - v''-o 'a.out''-mtune = generic''-march = pentiumpro'
c:/ mingw64w32 / bin /../ libexec / gcc / i686-w64-mingw32 / 4.7.2 / collect2.exe - sysroot = / home / drangon / work / mingw-w64-dgn_32 / target -m i386pe -Bdynamic -o a.out c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 / ../../../../i686-w64-mingw32/lib/../lib/crt2.oc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2 / crtbegin.o -Lc:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32 / 4.7.2-Lc:/ mingw64w32 / bin /../lib/gcc -Lc:/mingw64w32/bin/ ../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib -Lc:/ mingw64w32 / bin /。 ./lib/gcc/i686-w64-mingw32/4.7.2/../../../../lib -Lc:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32 / 4.7.2 /../../../../i686-w64-mingw32 / lib -Lc:/ mingw64w32 / bin /../lib/gcc/i686-w64-mingw32 / 4.7.2 / .. /../.. C:/Users/Joe/AppData/Local/Temp/test-709513.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 / crtend.o
C:/ Users / Joe / AppData / Local / Temp / test-709513.o:fake :(。text + 0x4d):未定义的引用`objc_lookup_class'
C:/Users/Joe/AppData/Local/Temp/test-709513.o:fake :(。 0x62):未定义的引用`objc_msg_lookup'
C:/Users/Joe/AppData/Local/Temp/test-709513.o:fake :(。text + 0x9e):未定义引用`__objc_exec_class'
c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /../../../../ i686-w64-mingw32 / bin / ld.exe:C: /Users/Joe/AppData/Local/Temp/test-709513.o:坏的重定位地址0x14在``data'
c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /../../../../ i686-w64-mingw32 / bin / ld.exe:最终链接失败:操作无效
collect2.exe:错误:ld返回1退出状态
clang:error:linker(via gcc)命令失败,退出代码1(使用-v查看调用)

通过google搜索,我发现objc_lookup_class是一个方法定义在gnustep的libobjc库和苹果的libojbc.dll的.def文件:libojbc.def,我找到另一个名为objc_lookUpClass的方法。
google search again.so,
apple的libojbc与gnustep的libobjc不同。
apple's libojbc使用NextStep库interface.gnustep创建了一个不同的。



man gcc



gcc有两个选项。



-fgnu-runtime 。这是gcc的默认选项,使用gnu风格的运行时。

-fnext-runtime ,这使用nextstep

所以我将nextstep样式选项传递给clang(或gcc?)。
clang -fnext-runtime



编译.o到.s没有错误。 .exe找到所有的方法,它需要从苹果的libobjc库文件。但另一个错误发生,用-v选项,这里是细节:

  clang version 3.1(branches / release_31)
目标:i686-w64-mingw32
线程型号:posix
c:/mingw64w32/bin/clang.exe-cc1 -triple i686- w64-mingw32 -S -disable-free -main-file-name test.m -mrelocation-model static -mdisable-fp-elim -mconstructor-aliases -target-cpu pentium4 -target-linker-version 2.20.51.0.2 - momit-leaf-frame-pointer -v -resource-dirc:/mingw64w32/bin\\..\\lib\\clang\\3.1-fmodule-cache-pathC :/ Users / Joe / AppData / Local / Temp \\ clang-module-cache-fno-dwarf-directory-asm -fdebug-compilation-dir C:/ MINGW64-X86-MSYS-20111123 / home / ferror-limit 19 -fmessage-length 0 -mstackrealign -fno-use-cxa-atexit -fobjc-fragile-abi -fobjc-exceptions -fdiagnostics-show-option -o C:/ Users / Joe / AppData / Local / Temp / test-467378.s -x objective-c test.m
clang -cc1 3.1基于LLVM 3.1缺省目标i686-w64-mingw32
忽略不存在的目录/ usr / local / include
忽略不存在的目录c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../../ x86_64-w64-mingw32 / include
忽略不存在的目录/ mingw /包括
忽略不存在的目录c:/ mingw / include
忽略不存在的目录/ usr / include
#include...搜索从这里开始:
# include< ...>搜索从这里开始:
c:/ mingw64w32 / bin /../ lib / clang / 3.1 / include
c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../。 ./i686-w64-mingw32/include
c:/ mingw64w32 / bin /../ lib / clang / 3.1 /../../../ include
搜索列表的结尾。
c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe-fnext-runtime -v -c -o C:/Users/Joe/AppData/Local/Temp/test-467379.o -x汇编程序C:/Users/Joe/AppData/Local/Temp/test-467378.s
使用内置规范。
COLLECT_GCC = c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
目标:i686-w64-mingw32
配置为:/ home / drangon / work / mingw-w64 -dgn_32 / source / gcc / configure --host = i686-w64-mingw32 --target = i686-w64-mingw32 --disable-nls --enable-languages = c,c ++,objc,obj-c ++ --with- gmp = / home / drangon / work / mingw-w64-dgn_32 / build / for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix = / home / drangon / work / mingw- w64-dgn_32 / target --with-sysroot = / home / drangon / work / mingw-w64-dgn_32 / target
线程模型:win32
gcc version 4.7.2 20120823(prerelease)(GCC)
COLLECT_GCC_OPTIONS =' - fnext-runtime''-v''-c''-o''C:/Users/Joe/AppData/Local/Temp/test-467379.o''-mtune = generic'' -march = pentiumpro'
c:/ mingw64w32 / bin /../ lib / gcc / i686-w64-mingw32 / 4.7.2 /../../../../ i686-w64-mingw32 / bin / as.exe -v -o C:/Users/Joe/AppData/Local/Temp/test-467379.o C:/Users/Joe/AppData/Local/Temp/test-467378.s
GNU汇编器版本2.23.51(i686-w64-mingw32)使用BFD版本(GNU Binutils)2.23.51.20120823
C:/Users/Joe/AppData/Local/Temp/test-467378.s:汇编消息:
C:/Users/Joe/AppData/Local/Temp/test-467378.s:4:错误:未知的伪操作:`.lazy_reference'
C:/ Users / Joe / AppData / Local / Temp /test-467378.s:57:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:57:错误:垃圾在行尾,首先无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:67:错误:错误或不可约的绝对表达式
C:/ Users / Joe / AppData /Local/Temp/test-467378.s:67:错误:垃圾在行的末尾,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s :76:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:76:错误:行结束处的垃圾,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:92:错误:错误或不可约的绝对表达式
C:/ Users / Joe / AppData / Local / Temp / test -467378.s:92:错误:垃圾在行的末尾,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:99:错误:坏或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:99:错误:垃圾在行尾,第一个无法识别的字符是`,'
C: /Users/Joe/AppData/Local/Temp/test-467378.s:107:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:107 :错误:垃圾在行的末尾,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:123:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:123:错误:垃圾在行尾,第一个无法识别的字符是`,'
C:/ Users / Joe / AppData /Local/Temp/test-467378.s:128:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:128:错误:垃圾在结束,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:133:错误:错误或不可约的绝对表达式
C:/ Users /Joe/AppData/Local/Temp/test-467378.s:133:错误:垃圾在行末,第一个无法识别的字符是`,'
C:/ Users / Joe / AppData / Local / Temp / test -467378.s:137:错误:错误或不可约的绝对表达式
C:/Users/Joe/AppData/Local/Temp/test-467378.s:137:错误:行尾处的垃圾,第一个无法识别的字符是`,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:146:错误:错误或不可约的绝对表达式
C:/ Users / Joe / AppData / Local /Temp/test-467378.s:146:错误:在行末的junk,第一个无法识别的字符是`,'
clang:error:assembler(via gcc)命令失败,退出代码为1(使用-v请参见调用)

我不知道Assembler语言。 .s文件。
所以我使用-S选项保持.s files.one是俚语与-fgnu-runtime。












。 pre> .def __c_Foo__fooWithBar;
.scl 3;
.type 32;
.endef
.text
.align 16,0x90
__c_Foo__fooWithBar:
pushl%ebp
movl%esp,%ebp
subl $ 16 ,%esp
movl 12(%ebp),%eax
movl 8(%ebp),%ecx
leal L_.str,%edx
movl%ecx,-4 (%ebp)
movl%eax,-8(%ebp)
movl%edx,(%esp)
calll _printf
movl%eax,-12
addl $ 16,%esp
popl%ebp
ret

.def _main;
.scl 2;
.type 32;
.endef
.globl _main
.align 16,0x90
_main:
pushl%ebp
movl%esp,%ebp
pushl %esi
subl $ 20,%esp
calll ___main
leal L_.class_name,%eax
movl $ 0,-8(%ebp)
movl%eax, %esp)
calll _objc_lookup_class
leal _.objc_selector_list,%ecx
movl%eax,(%esp)
movl%ecx,4(%esp)
movl %eax,-12(%ebp)
calll _objc_msg_lookup
movl $ 0,%ecx
leal _.objc_selector_list,%edx
movl -12(%ebp),%esi
movl%esi,(%esp)
movl%edx,4(%esp)
movl%ecx,-16(%ebp)
calll *%eax
movl -16(%ebp),%eax
addl $ 20,%esp
popl%esi
popl%ebp
ret

.def _。 objc_load_function;
.scl 3;
.type 32;
.endef
.align 16,0x90
_.objc_load_function:
.cfi_startproc
pushl%ebp
Ltmp2:
.cfi_def_cfa_offset 8
Ltmp3:
.cfi_offset%ebp,-8
movl%esp,%ebp
Ltmp4:
.cfi_def_cfa_register%ebp
pushl%eax $ b b leal ___unnamed_1,%eax
movl%eax,(%esp)
calll ___objc_exec_class
addl $ 4,%esp
popl%ebp
ret
。 cfi_endproc

.data
L_.str:
.ascizabc

.globl ___objc_class_name_Foo
.align 4
___objc_class_name_Foo:
.long 0

L___unnamed_2:
.ascizcount

L___unnamed_3:
.ascizi

.globl ___ objc_ivar_offset_value_Foo.count
.align 4
___ objc_ivar_offset_value_Foo.count:
.long 0

.align 4
_.ivar .offsets:
.long ___ objc_ivar_offset_value_Foo.count

.lcomm _.objc_property_list,8,8
L___unnamed_4:
.ascizv8 @ 0:4

L___unnamed_5:
.ascizfooWithBar

.align 16
_.objc_method_list:
.long 0
.long 1
.long L___unnamed_5
.long L___unnamed_4
.long __c_Foo__fooWithBar

.align 8
_.objc_ivar_list:
.long 1
.long L___unnamed_2
.long L___unnamed_3
.long 0

.globl ___ objc_ivar_offset_Foo.count
.align 4
___ objc_ivar_offset_Foo.count:
.long _.objc_ivar_list + 12

L_.class_name:
.ascizFoo

.globl __OBJC_METACLASS_Foo
.align 16
__OBJC_METACLASS_Foo:
.long 0
.long 0
.long L_.class_name
.long 0
.long 18
.long 72
.long 0
.long _.objc_method_list
.long 0
.long 0
.long 0
.long 0
.long 0
.long 1
.long 0
.long 0
.long 0
.long 0

.lcomm _.objc_protocol_list,8,8
.globl __OBJC_CLASS_Foo
.align 16
__OBJC_CLASS_Foo:
.long __OBJC_METACLASS_Foo
.long 0
.long L_.class_name
.long 0
.long 17
.long 4
.long _.objc_ivar_list
.long 0
.long 0
.long 0
.long 0
.long _.objc_protocol_list
.long 0
.long 1
.long _.ivar.offsets
.long _.objc_property_list
.long 1
.long 1

.section .rdata $ __ objc_class_ref_Foo,r
.linkonce discard
.globl ___objc_class_ref_Foo
.align 4
___objc_class_ref_Foo:
.long ___objc_class_name_Foo

.data
L___unnamed_6:
.ascizAnotherHack

L___unnamed_7:
.asciz __ObjC_Protocol_Holder_Ugly_Hack

.lcomm _.objc_protocol_list1,8,8
.align 16
___unnamed_8:
.long L___unnamed_6
.long L___unnamed_7
.long 0
.long 0
.long _.objc_protocol_list1

.section .rdata $ .objc_sel_namefooWithBar,r
.linkonce discard
.globl _.objc_sel_namefooWithBar
_.objc_sel_namefooWithBar:
.ascizfooWithBar

.data
.align 8
_.objc_selector_list:
.long _.objc_sel_namefooWithBar
.long L___unnamed_4
.zero 8

.align 16
___unnamed_9:
.long 1
.long _.objc_selector_list
.short 1
.short 1
.long __OBJC_CLASS_Foo
.long ___unnamed_8
.long 0
.long 0

L_.objc_source_file_name:
.asciz./test.m

.align 8
___unnamed_1:
.long 8
.long 16
.long L_.objc_source_file_name
.long ___unnamed_9

.section .ctors,w
.align 4
.long _.objc_load_function

// test.s,clang with -fnext-runtime option

  .objc_class_name_Foo = 0 
.globl .objc_class_name_Foo
.lazy_reference .objc_class_name_Foo


.def _2B__5B_Foo_20_fooWithBar_5D_ ;
。scl 3;
.type 32;
.endef
.text
.align 16,0x90
_2B__5B_Foo_20_fooWithBar_5D_:
pushl%ebp
movl%esp,%ebp
subl $ 16 ,%esp
movl 12(%ebp),%eax
movl 8(%ebp),%ecx
leal L_.str,%edx
movl%ecx,-4 (%ebp)
movl%eax,-8(%ebp)
movl%edx,(%esp)
calll _printf
movl%eax,-12
addl $ 16,%esp
popl%ebp
ret

.def _main;
.scl 2;
.type 32;
.endef
.globl _main
.align 16,0x90
_main:
pushl%ebp
movl%esp,%ebp
subl $ 16,%esp
calll ___main
movl $ 0,%eax
movl $ 0,-4(%ebp)
movl L_OBJC_CLASS_REFERENCES_,%ecx
movl L_OBJC_SELECTOR_REFERENCES_,%edx
movl%ecx,(%esp)
movl%edx,4(%esp)
movl%eax,-8(%ebp)
calll _objc_msgSend
movl -8(%ebp),%eax
addl $ 16,%esp
popl%ebp
ret

.data
L_.str:
.ascizabc

.section __TEXT,__ cstring,cstring_literals,w
L_OBJC_METH_VAR_NAME_:
.ascizfooWithBar

L_OBJC_METH_VAR_TYPE_ :
.ascizv8 @ 0:4

L_OBJC_CLASS_NAME_:
.ascizFoo

.section __OBJC,__ cls_meth,regular,no_dead_strip ,w
.align 4
L_OBJC_CLASS_METHODS_Foo:
.long 0
.long 1
.long L_OBJC_METH_VAR_NAME_
.long L_OBJC_METH_VAR_TYPE_
。 long _2B__5B_Foo_20_fooWithBar_5D_

.section __OBJC,__ meta_class,regular,no_dead_strip,w
.align 4
L_OBJC_METACLASS_Foo:
.long L_OBJC_CLASS_NAME_

.long L_OBJC_CLASS_NAME_
.long 0
.long 2
.long 48
.long 0
.long L_OBJC_CLASS_METHODS_Foo
.long 0
.long 0
.long 0
.long 0

.section __TEXT,__ cstring,cstring_literals,w
L_OBJC_METH_VAR_NAME_1:
。 ascizcount

L_OBJC_METH_VAR_TYPE_2:
.ascizi

.section __OBJC,__ instance_vars,regular,no_dead_strip,w
。 4
L_OBJC_INSTANCE_VARIABLES_Foo:
.long 1
.long L_OBJC_METH_VAR_NAME_1
.long L_OBJC_METH_VAR_TYPE_2
.long 0

.section __OBJC,__ class,regular ,no_dead_strip,w
.align 4
L_OBJC_CLASS_Foo:
.long L_OBJC_METACLASS_Foo
.long 0
.long L_OBJC_CLASS_NAME_
.long 0
.long 1
.long 4
.long L_OBJC_INSTANCE_VARIABLES_Foo
.long 0
.long 0
.long 0
.long 0
.long 0

.section __OBJC,__ cls_refs,literal_pointers,no_dead_strip,w
.align 4
L_OBJC_CLASS_REFERENCES_:
.long L_OBJC_CLASS_NAME_

.section __OBJC,__ message_refs,literal_pointers,no_dead_strip,w
.align 4
L_OBJC_SELECTOR_REFERENCES_:
.long L_OBJC_METH_VAR_NAME_

.section __TEXT,__ cstring,cstring_literals ,w
L_OBJC_CLASS_NAME_3:
.zero 1

.section __OBJC,__ symbols,regular,no_dead_strip,w
.align 4
L_OBJC_SYMBOLS :
.long 0
.long 0
.short 1
.short 0
.long L_OBJC_CLASS_Foo

.section __OBJC,__ module_info, regular,no_dead_strip,w
.align 4
L_OBJC_MODULES:
.long 7
.long 16
.long L_OBJC_CLASS_NAME_3
.long L_OBJC_SYMBOLS

我相信关键问题是从.s文件创建方式。



任何人都可以帮我解决这个问题?
通过使用这些.dll文件无法创建业务应用程序。



但通过使用这些.dll,我们可以在窗口平台上构建一个可口的可学习环境。所有框架的Windows版本比gnustep更稳定和有用。



谢谢。

解决方案

嗯,首先这违反了iTunes EULA,所以无论是商业还是不是你不应该这样做。



第二个问题是在clang / gcc中的-fnext-runtime仅对Darwin起作用,它缺少用于Windows和其他操作系统的各种位和片段。



正如你所看到的,-fnext-runtime正在释放Darwin特定的汇编器命令,例如.lazy_reference在Windows上不是一个好的开始。



在gcc和现在clang中使用-fnext-runtime的情况已经很长时间了,没有人维护-fnext-runtime在非达尔文系统的主线。



我粗略的了解是,苹果实际上不直接在Windows上使用clang,他们重写Objective-C C并使用Visual Studio编译Windows。



你可以开始做一些严重的黑客攻击,或者不打扰。


i have a problem when compile objective-c source code on windows platform. of course compile objective-c source code on windows platform , we usually using gnustep environment(gcc objecitve-c compiler . gnustep libojc dynamic library . gnustep foundation framework ... and so on).

but i want a clean environment try compiler objective-c , and use a different libobjc library.

since mac os x 10.6 . apple move macosx system to x86 platform(no ppc support any more) , AND REWRITE system application by cocoa tech.include iTunes.

and iTunes have windows version.

by searching system folders after install iTunes.i found any support dll file in: C:\Program Files (x86)\Common Files\Apple\Apple Application Support

by the way , my system is windows 7 x86_64.

i found it has:

ApplePushService.dll
AppleVersions.dll
APSDaemon_main.dll
ASL.dll
AVFoundationCF.dll
CFNetwork.dll
CoreAudioToolbox.dll
CoreFoundation.dll
CoreGraphics.dll
CoreMedia.dll
CoreText.dll
CoreVideo.dll
Foundation.dll
icudt46.dll
icuin40.dll
icuuc40.dll
JavaScriptCore.dll
libcache.dll
libdispatch.dll
libicuin.dll
libicuuc.dll
libtidy.dll
libxml2.dll
libxslt.dll
MediaToolbox.dll
objc.dll
pthreadVC2.dll
QTMovieWin.dll
QuartzCore.dll
SQLite3.dll
VideoToolbox.dll
WebKit.dll
WebKitQuartzCoreAdditions.dll
YSCrashDump.dll
YSUtilities.dll
zlib1.dll

look like , apple implement these low level framework to windows platform.

CFNetwork.framework -> CFNetwork.dll 

CoreGraphics.framework -> CoreGraphics.dll

Foundation.framework -> Foundation.dll

libobjc.a.dylib -> objc.dll

WebKit.framework -> WebKit.dll

so , i think using apple's libobjc release version is better(iTunes is running well).the others library file is useful too.

i want build a learnning environment for objective-c beginner people(my class mates and i).

so i copy objc.dll and rename it to libobjc.dll

using mingw tool "pexports" export libobjc.dll 's def to libobjc.def then using visual studio command tool "lib.exe" convert .def file to libobjc.lib.

then i download

  • mingw64's x86(32 bit) compilers dng precompiled package.
  • mingw64's clang+llvm(32 bit) compilers dng precompiled package.
  • mingw64's msys environment precompiled package.

install these 3 package to system. then copy libobjc.dll,libobjc.lib to /lib (on windows platform , .a and .lib using same bin format).

then i wrote a sample objective-c source code.code is here: file:test.m

#import <stdio.h>

@interface Foo {
    int count;
}

+ (void)fooWithBar;

@end

@implementation Foo

+ (void)fooWithBar {
    printf("abc");
}

@end


int main(){
    [Foo fooWithBar];
    return 0;
}

simply compile it:

clang test.m

error happen, then using -v options show detail:

clang version 3.1 (branches/release_31)
Target: i686-w64-mingw32
Thread model: posix
 "c:/mingw64w32/bin/clang.exe" -cc1 -triple i686-w64-mingw32 -S -disable-free -main-file-name test.m -mrelocation-model static -mdisable-fp-elim -mconstructor-aliases -target-cpu pentium4 -target-linker-version 2.20.51.0.2 -momit-leaf-frame-pointer -v -resource-dir "c:/mingw64w32/bin\\..\\lib\\clang\\3.1" -fmodule-cache-path "C:/Users/Joe/AppData/Local/Temp\\clang-module-cache" -fno-dwarf-directory-asm -fdebug-compilation-dir C:/MINGW64-X86-MSYS-20111123/home/Joe -ferror-limit 19 -fmessage-length 0 -mstackrealign -fno-use-cxa-atexit -fgnu-runtime -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-fragile-abi -fobjc-exceptions -fdiagnostics-show-option -o C:/Users/Joe/AppData/Local/Temp/test-709512.s -x objective-c test.m
clang -cc1 version 3.1 based upon LLVM 3.1 default target i686-w64-mingw32
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "c:/mingw64w32/bin/../lib/clang/3.1/../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "/mingw/include"
ignoring nonexistent directory "c:/mingw/include"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 c:/mingw64w32/bin/../lib/clang/3.1/include
 c:/mingw64w32/bin/../lib/clang/3.1/../../../i686-w64-mingw32/include
 c:/mingw64w32/bin/../lib/clang/3.1/../../../include
End of search list.
 "c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe" -v -c -o C:/Users/Joe/AppData/Local/Temp/test-709513.o -x assembler C:/Users/Joe/AppData/Local/Temp/test-709512.s
Using built-in specs.
COLLECT_GCC=c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
Target: i686-w64-mingw32
Configured with: /home/drangon/work/mingw-w64-dgn_32/source/gcc/configure --host=i686-w64-mingw32 --target=i686-w64-mingw32 --disable-nls --enable-languages=c,c++,objc,obj-c++ --with-gmp=/home/drangon/work/mingw-w64-dgn_32/build/for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix=/home/drangon/work/mingw-w64-dgn_32/target --with-sysroot=/home/drangon/work/mingw-w64-dgn_32/target
Thread model: win32
gcc version 4.7.2 20120823 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-c' '-o' 'C:/Users/Joe/AppData/Local/Temp/test-709513.o' '-mtune=generic' '-march=pentiumpro'
 c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/as.exe -v -o C:/Users/Joe/AppData/Local/Temp/test-709513.o C:/Users/Joe/AppData/Local/Temp/test-709512.s
GNU assembler version 2.23.51 (i686-w64-mingw32) using BFD version (GNU Binutils) 2.23.51.20120823
COMPILER_PATH=c:/mingw64w32/bin/../libexec/gcc/i686-w64-mingw32/4.7.2/;c:/mingw64w32/bin/../libexec/gcc/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/
LIBRARY_PATH=c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/;c:/mingw64w32/bin/../lib/gcc/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../
COLLECT_GCC_OPTIONS='-v' '-c' '-o' 'C:/Users/Joe/AppData/Local/Temp/test-709513.o' '-mtune=generic' '-march=pentiumpro'
 "c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe" -v -o a.out C:/Users/Joe/AppData/Local/Temp/test-709513.o
Using built-in specs.
COLLECT_GCC=c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw64w32/bin/../libexec/gcc/i686-w64-mingw32/4.7.2/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: /home/drangon/work/mingw-w64-dgn_32/source/gcc/configure --host=i686-w64-mingw32 --target=i686-w64-mingw32 --disable-nls --enable-languages=c,c++,objc,obj-c++ --with-gmp=/home/drangon/work/mingw-w64-dgn_32/build/for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix=/home/drangon/work/mingw-w64-dgn_32/target --with-sysroot=/home/drangon/work/mingw-w64-dgn_32/target
Thread model: win32
gcc version 4.7.2 20120823 (prerelease) (GCC) 
COMPILER_PATH=c:/mingw64w32/bin/../libexec/gcc/i686-w64-mingw32/4.7.2/;c:/mingw64w32/bin/../libexec/gcc/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/
LIBRARY_PATH=c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/;c:/mingw64w32/bin/../lib/gcc/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/;c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../
COLLECT_GCC_OPTIONS='-v' '-o' 'a.out' '-mtune=generic' '-march=pentiumpro'
 c:/mingw64w32/bin/../libexec/gcc/i686-w64-mingw32/4.7.2/collect2.exe --sysroot=/home/drangon/work/mingw-w64-dgn_32/target -m i386pe -Bdynamic -o a.out c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib/crt2.o c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/crtbegin.o -Lc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2 -Lc:/mingw64w32/bin/../lib/gcc -Lc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib/../lib -Lc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../lib -Lc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/lib -Lc:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../.. C:/Users/Joe/AppData/Local/Temp/test-709513.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/crtend.o
C:/Users/Joe/AppData/Local/Temp/test-709513.o:fake:(.text+0x4d): undefined reference to `objc_lookup_class'
C:/Users/Joe/AppData/Local/Temp/test-709513.o:fake:(.text+0x62): undefined reference to `objc_msg_lookup'
C:/Users/Joe/AppData/Local/Temp/test-709513.o:fake:(.text+0x9e): undefined reference to `__objc_exec_class'
c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/ld.exe: C:/Users/Joe/AppData/Local/Temp/test-709513.o: bad reloc address 0x14 in section `.data'
c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

by google searching , i found objc_lookup_class is a method defined in gnustep's libobjc library.and in apple's libojbc.dll 's .def file:"libojbc.def" , i found another method named "objc_lookUpClass". google searching again.so, apple's libojbc are different with gnustep's libobjc. apple's libojbc using NextStep library interface.gnustep made a different one.

man gcc

gcc have two options about this.

-fgnu-runtime . that's gcc's default options,using gnu style runtime.
-fnext-runtime , this using nextstep(now it's apple) style running.

so i pass nextstep style option to clang(or gcc?). clang -fnext-runtime

compile .o to .s with no error.seem like ld.exe finds all method it need from apple's libobjc library file.but another error happen,with -v options,here are detail:

clang version 3.1 (branches/release_31)
Target: i686-w64-mingw32
Thread model: posix
 "c:/mingw64w32/bin/clang.exe" -cc1 -triple i686-w64-mingw32 -S -disable-free -main-file-name test.m -mrelocation-model static -mdisable-fp-elim -mconstructor-aliases -target-cpu pentium4 -target-linker-version 2.20.51.0.2 -momit-leaf-frame-pointer -v -resource-dir "c:/mingw64w32/bin\\..\\lib\\clang\\3.1" -fmodule-cache-path "C:/Users/Joe/AppData/Local/Temp\\clang-module-cache" -fno-dwarf-directory-asm -fdebug-compilation-dir C:/MINGW64-X86-MSYS-20111123/home/Joe -ferror-limit 19 -fmessage-length 0 -mstackrealign -fno-use-cxa-atexit -fobjc-fragile-abi -fobjc-exceptions -fdiagnostics-show-option -o C:/Users/Joe/AppData/Local/Temp/test-467378.s -x objective-c test.m
clang -cc1 version 3.1 based upon LLVM 3.1 default target i686-w64-mingw32
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "c:/mingw64w32/bin/../lib/clang/3.1/../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "/mingw/include"
ignoring nonexistent directory "c:/mingw/include"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 c:/mingw64w32/bin/../lib/clang/3.1/include
 c:/mingw64w32/bin/../lib/clang/3.1/../../../i686-w64-mingw32/include
 c:/mingw64w32/bin/../lib/clang/3.1/../../../include
End of search list.
 "c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe" -fnext-runtime -v -c -o C:/Users/Joe/AppData/Local/Temp/test-467379.o -x assembler C:/Users/Joe/AppData/Local/Temp/test-467378.s
Using built-in specs.
COLLECT_GCC=c:/mingw64w32/bin/i686-w64-mingw32-gcc.exe
Target: i686-w64-mingw32
Configured with: /home/drangon/work/mingw-w64-dgn_32/source/gcc/configure --host=i686-w64-mingw32 --target=i686-w64-mingw32 --disable-nls --enable-languages=c,c++,objc,obj-c++ --with-gmp=/home/drangon/work/mingw-w64-dgn_32/build/for_target --enable-twoprocess --disable-libstdcxx-pch --disable-win32-registry --prefix=/home/drangon/work/mingw-w64-dgn_32/target --with-sysroot=/home/drangon/work/mingw-w64-dgn_32/target
Thread model: win32
gcc version 4.7.2 20120823 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-fnext-runtime' '-v' '-c' '-o' 'C:/Users/Joe/AppData/Local/Temp/test-467379.o' '-mtune=generic' '-march=pentiumpro'
 c:/mingw64w32/bin/../lib/gcc/i686-w64-mingw32/4.7.2/../../../../i686-w64-mingw32/bin/as.exe -v -o C:/Users/Joe/AppData/Local/Temp/test-467379.o C:/Users/Joe/AppData/Local/Temp/test-467378.s
GNU assembler version 2.23.51 (i686-w64-mingw32) using BFD version (GNU Binutils) 2.23.51.20120823
C:/Users/Joe/AppData/Local/Temp/test-467378.s: Assembler messages:
C:/Users/Joe/AppData/Local/Temp/test-467378.s:4: Error: unknown pseudo-op: `.lazy_reference'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:57: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:57: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:67: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:67: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:76: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:76: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:92: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:92: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:99: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:99: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:107: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:107: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:123: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:123: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:128: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:128: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:133: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:133: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:137: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:137: Error: junk at end of line, first unrecognized character is `,'
C:/Users/Joe/AppData/Local/Temp/test-467378.s:146: Error: bad or irreducible absolute expression
C:/Users/Joe/AppData/Local/Temp/test-467378.s:146: Error: junk at end of line, first unrecognized character is `,'
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)

i don't know Assembler language.but seem like Assembler app couldn't understand this .s file. so i using -S option to keep .s files.one is clang with -fgnu-runtime . other is clang with -fnext-runtime.

//test.s ,clang with -fgnu-runtime option

    .def     __c_Foo__fooWithBar;
    .scl    3;
    .type    32;
    .endef
    .text
    .align    16, 0x90
__c_Foo__fooWithBar:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    12(%ebp), %eax
    movl    8(%ebp), %ecx
    leal    L_.str, %edx
    movl    %ecx, -4(%ebp)
    movl    %eax, -8(%ebp)
    movl    %edx, (%esp)
    calll    _printf
    movl    %eax, -12(%ebp)
    addl    $16, %esp
    popl    %ebp
    ret

    .def     _main;
    .scl    2;
    .type    32;
    .endef
    .globl    _main
    .align    16, 0x90
_main:
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %esi
    subl    $20, %esp
    calll    ___main
    leal    L_.class_name, %eax
    movl    $0, -8(%ebp)
    movl    %eax, (%esp)
    calll    _objc_lookup_class
    leal    _.objc_selector_list, %ecx
    movl    %eax, (%esp)
    movl    %ecx, 4(%esp)
    movl    %eax, -12(%ebp)
    calll    _objc_msg_lookup
    movl    $0, %ecx
    leal    _.objc_selector_list, %edx
    movl    -12(%ebp), %esi
    movl    %esi, (%esp)
    movl    %edx, 4(%esp)
    movl    %ecx, -16(%ebp)
    calll    *%eax
    movl    -16(%ebp), %eax
    addl    $20, %esp
    popl    %esi
    popl    %ebp
    ret

    .def     _.objc_load_function;
    .scl    3;
    .type    32;
    .endef
    .align    16, 0x90
_.objc_load_function:
    .cfi_startproc
    pushl    %ebp
Ltmp2:
    .cfi_def_cfa_offset 8
Ltmp3:
    .cfi_offset %ebp, -8
    movl    %esp, %ebp
Ltmp4:
    .cfi_def_cfa_register %ebp
    pushl    %eax
    leal    ___unnamed_1, %eax
    movl    %eax, (%esp)
    calll    ___objc_exec_class
    addl    $4, %esp
    popl    %ebp
    ret
    .cfi_endproc

    .data
L_.str:
    .asciz     "abc"

    .globl    ___objc_class_name_Foo
    .align    4
___objc_class_name_Foo:
    .long    0

L___unnamed_2:
    .asciz     "count"

L___unnamed_3:
    .asciz     "i"

    .globl    ___objc_ivar_offset_value_Foo.count
    .align    4
___objc_ivar_offset_value_Foo.count:
    .long    0

    .align    4
_.ivar.offsets:
    .long    ___objc_ivar_offset_value_Foo.count

    .lcomm    _.objc_property_list,8,8
L___unnamed_4:
    .asciz     "v8@0:4"

L___unnamed_5:
    .asciz     "fooWithBar"

    .align    16
_.objc_method_list:
    .long    0
    .long    1
    .long    L___unnamed_5
    .long    L___unnamed_4
    .long    __c_Foo__fooWithBar

    .align    8
_.objc_ivar_list:
    .long    1
    .long    L___unnamed_2
    .long    L___unnamed_3
    .long    0

    .globl    ___objc_ivar_offset_Foo.count
    .align    4
___objc_ivar_offset_Foo.count:
    .long    _.objc_ivar_list+12

L_.class_name:
    .asciz     "Foo"

    .globl    __OBJC_METACLASS_Foo
    .align    16
__OBJC_METACLASS_Foo:
    .long    0
    .long    0
    .long    L_.class_name
    .long    0
    .long    18
    .long    72
    .long    0
    .long    _.objc_method_list
    .long    0
    .long    0
    .long    0
    .long    0
    .long    0
    .long    1
    .long    0
    .long    0
    .long    0
    .long    0

    .lcomm    _.objc_protocol_list,8,8
    .globl    __OBJC_CLASS_Foo
    .align    16
__OBJC_CLASS_Foo:
    .long    __OBJC_METACLASS_Foo
    .long    0
    .long    L_.class_name
    .long    0
    .long    17
    .long    4
    .long    _.objc_ivar_list
    .long    0
    .long    0
    .long    0
    .long    0
    .long    _.objc_protocol_list
    .long    0
    .long    1
    .long    _.ivar.offsets
    .long    _.objc_property_list
    .long    1
    .long    1

    .section    .rdata$__objc_class_ref_Foo,"r"
    .linkonce discard
    .globl    ___objc_class_ref_Foo
    .align    4
___objc_class_ref_Foo:
    .long    ___objc_class_name_Foo

    .data
L___unnamed_6:
    .asciz     "AnotherHack"

L___unnamed_7:
    .asciz     "__ObjC_Protocol_Holder_Ugly_Hack"

    .lcomm    _.objc_protocol_list1,8,8
    .align    16
___unnamed_8:
    .long    L___unnamed_6
    .long    L___unnamed_7
    .long    0
    .long    0
    .long    _.objc_protocol_list1

    .section    .rdata$.objc_sel_namefooWithBar,"r"
    .linkonce discard
    .globl    _.objc_sel_namefooWithBar
_.objc_sel_namefooWithBar:
    .asciz     "fooWithBar"

    .data
    .align    8
_.objc_selector_list:
    .long    _.objc_sel_namefooWithBar
    .long    L___unnamed_4
    .zero    8

    .align    16
___unnamed_9:
    .long    1
    .long    _.objc_selector_list
    .short    1
    .short    1
    .long    __OBJC_CLASS_Foo
    .long    ___unnamed_8
    .long    0
    .long    0

L_.objc_source_file_name:
    .asciz     "./test.m"

    .align    8
___unnamed_1:
    .long    8
    .long    16
    .long    L_.objc_source_file_name
    .long    ___unnamed_9

    .section    .ctors,"w"
    .align    4
    .long    _.objc_load_function

//test.s ,clang with -fnext-runtime option

    .objc_class_name_Foo=0
    .globl .objc_class_name_Foo
    .lazy_reference .objc_class_name_Foo


    .def     _2B__5B_Foo_20_fooWithBar_5D_;
    .scl    3;
    .type    32;
    .endef
    .text
    .align    16, 0x90
_2B__5B_Foo_20_fooWithBar_5D_:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    12(%ebp), %eax
    movl    8(%ebp), %ecx
    leal    L_.str, %edx
    movl    %ecx, -4(%ebp)
    movl    %eax, -8(%ebp)
    movl    %edx, (%esp)
    calll    _printf
    movl    %eax, -12(%ebp)
    addl    $16, %esp
    popl    %ebp
    ret

    .def     _main;
    .scl    2;
    .type    32;
    .endef
    .globl    _main
    .align    16, 0x90
_main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    calll    ___main
    movl    $0, %eax
    movl    $0, -4(%ebp)
    movl    L_OBJC_CLASS_REFERENCES_, %ecx
    movl    L_OBJC_SELECTOR_REFERENCES_, %edx
    movl    %ecx, (%esp)
    movl    %edx, 4(%esp)
    movl    %eax, -8(%ebp)
    calll    _objc_msgSend
    movl    -8(%ebp), %eax
    addl    $16, %esp
    popl    %ebp
    ret

    .data
L_.str:
    .asciz     "abc"

    .section    __TEXT,__cstring,cstring_literals,"w"
L_OBJC_METH_VAR_NAME_:
    .asciz     "fooWithBar"

L_OBJC_METH_VAR_TYPE_:
    .asciz     "v8@0:4"

L_OBJC_CLASS_NAME_:
    .asciz     "Foo"

    .section    __OBJC,__cls_meth,regular,no_dead_strip,"w"
    .align    4
L_OBJC_CLASS_METHODS_Foo:
    .long    0
    .long    1
    .long    L_OBJC_METH_VAR_NAME_
    .long    L_OBJC_METH_VAR_TYPE_
    .long    _2B__5B_Foo_20_fooWithBar_5D_

    .section    __OBJC,__meta_class,regular,no_dead_strip,"w"
    .align    4
L_OBJC_METACLASS_Foo:
    .long    L_OBJC_CLASS_NAME_
    .long    0
    .long    L_OBJC_CLASS_NAME_
    .long    0
    .long    2
    .long    48
    .long    0
    .long    L_OBJC_CLASS_METHODS_Foo
    .long    0
    .long    0
    .long    0
    .long    0

    .section    __TEXT,__cstring,cstring_literals,"w"
L_OBJC_METH_VAR_NAME_1:
    .asciz     "count"

L_OBJC_METH_VAR_TYPE_2:
    .asciz     "i"

    .section    __OBJC,__instance_vars,regular,no_dead_strip,"w"
    .align    4
L_OBJC_INSTANCE_VARIABLES_Foo:
    .long    1
    .long    L_OBJC_METH_VAR_NAME_1
    .long    L_OBJC_METH_VAR_TYPE_2
    .long    0

    .section    __OBJC,__class,regular,no_dead_strip,"w"
    .align    4
L_OBJC_CLASS_Foo:
    .long    L_OBJC_METACLASS_Foo
    .long    0
    .long    L_OBJC_CLASS_NAME_
    .long    0
    .long    1
    .long    4
    .long    L_OBJC_INSTANCE_VARIABLES_Foo
    .long    0
    .long    0
    .long    0
    .long    0
    .long    0

    .section    __OBJC,__cls_refs,literal_pointers,no_dead_strip,"w"
    .align    4
L_OBJC_CLASS_REFERENCES_:
    .long    L_OBJC_CLASS_NAME_

    .section    __OBJC,__message_refs,literal_pointers,no_dead_strip,"w"
    .align    4
L_OBJC_SELECTOR_REFERENCES_:
    .long    L_OBJC_METH_VAR_NAME_

    .section    __TEXT,__cstring,cstring_literals,"w"
L_OBJC_CLASS_NAME_3:
    .zero    1

    .section    __OBJC,__symbols,regular,no_dead_strip,"w"
    .align    4
L_OBJC_SYMBOLS:
    .long    0
    .long    0
    .short    1
    .short    0
    .long    L_OBJC_CLASS_Foo

    .section    __OBJC,__module_info,regular,no_dead_strip,"w"
    .align    4
L_OBJC_MODULES:
    .long    7
    .long    16
    .long    L_OBJC_CLASS_NAME_3
    .long    L_OBJC_SYMBOLS

i believe the key issues is from the .s file create way.

anyone can help me fix this problem? althrough using these .dll file could not create application for business.

but by using these .dll , we could build a greate cocoa learnning environment on window platform. all framework's windows version is more stable and useful than gnustep.

thanks.

解决方案

Well, first of all this is in violation of the iTunes EULA, so whether commercial or not you're not supposed to do it.

Second problem is that -fnext-runtime in clang/gcc only functions on Darwin, it is missing assorted bits and pieces for Windows and other operating systems. I'd (educated) guess and assume -fgnu-runtime is useless for linking against Apple's own frameworks.

As you can see -fnext-runtime is emitting Darwin specific assembler command, e.g. .lazy_reference, on Windows, not a great start.

This has been the situation with -fnext-runtime in gcc and now clang for quite a long time, no one maintains -fnext-runtime in the mainlines for non-Darwin systems.

My rough understanding is that Apple actually does not use clang directly on Windows, they rewrite the Objective-C into C and use Visual Studio to compile for Windows.

You can either start doing some serious hacking on clang, or don't bother.

这篇关于如何编译objective-c源代码与clang在mingw64-x86通过apple libobjc.dll?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆