首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过苹果libobjc.dll在mingw64x86中用clang编译objective源代码?

如何通过苹果libobjc.dll在mingw64x86中用clang编译objective源代码?
EN

Stack Overflow用户
提问于 2012-10-15 17:09:03
回答 2查看 3.6K关注 0票数 2

在windows平台上编译objective源代码时,我遇到了问题。当然,在windows平台上编译objecitve源代码,我们通常使用gnustep环境(gcc objecitve编译器)。gnustep libojc动态库。gnustep基础框架..。等等)。

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

自从mac x 10.6。苹果将macosx系统移动到x86平台(不再支持ppc ),并通过可可tech.include iTunes重写系统应用程序。

iTunes有windows版本。

通过在安装后搜索系统文件夹,我在:C:\Program Files (x86)\Common Files\Apple\Apple Application Support中找到了任何支持dll文件。

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

我发现它有:

代码语言:javascript
运行
复制
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平台上实现了这些低级别的框架。

代码语言:javascript
运行
复制
CFNetwork.framework -> CFNetwork.dll 

CoreGraphics.framework -> CoreGraphics.dll

Foundation.framework -> Foundation.dll

libobjc.a.dylib -> objc.dll

WebKit.framework -> WebKit.dll

因此,我认为使用苹果的libobjc发行版更好(iTunes运行良好).the其他库文件也很有用。

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

因此,我复制objc.dll并将其重命名为libobjc.dll

使用mingw工具"pexports“将libobjc.dll的def导出到libobjc.def,然后使用visual命令工具"lib.exe”将.def文件转换为libobjc.lib。

然后我下载

  • 明华64的x86(32位)编译器dng预编译包。
  • 明华64的clang+llvm(32位)编译器dng预编译包。
  • mingw64 64的msys环境预编译包。

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

然后我编写了一个示例目标-c源code.code在这里: file:test.m

代码语言:javascript
运行
复制
#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选项显示详细信息:

代码语言:javascript
运行
复制
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)

通过谷歌搜索,我发现objc_lookup_class是在苹果libojbc.dll的.def文件中的libobjc library.and中定义的一种方法:“libojbc.def”,我找到了另一种名为"objc_lookUpClass“的方法。google searching again.so,苹果的libojbc与gnustep的libobjc不同。

man gcc

gcc对此有两种选择。

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

-fnext-runtime,这使用nextstep(现在是苹果)风格运行。

所以我把nextstep风格的选项传给clang(或者gcc?)。clang -fnext-runtime

在没有像.o这样的error.seem的情况下,将error.seem编译成ld.exe,可以从苹果的libobjc库file.but中找到它需要的所有方法,还有另一个错误,使用-v选项,下面是详细信息:

代码语言:javascript
运行
复制
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)

我不知道汇编程序language.but看起来像汇编程序应用程序无法理解这个.s文件。因此,我使用-S选项来保持.s files.one与-fgnu-运行时一致。另一个是运行时。

//test.s,clang with -fgnu-运行时选项

代码语言:javascript
运行
复制
    .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运行时选项

代码语言:javascript
运行
复制
    .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

我认为关键问题来自于.s文件的创建方式。

有人能帮我解决这个问题吗?通过使用这些.dll文件,无法为业务创建应用程序。

但是,利用这些.dll,我们可以在窗口平台上构建一个优秀的可可学习环境。所有框架的windows版本都比gnustep更稳定和有用。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-16 03:02:06

首先,这违反了iTunes EULA,所以不管你是不是商业的,你都不应该这么做。

第二个问题是,clang/gcc的运行时只在达尔文上运行,它缺少Windows和其他操作系统的各种部件。我猜想和假设-fgnu-运行时对于与苹果自己的框架链接是无用的。

如您所见,运行时在Windows上发出达尔文特定的汇编程序命令,例如.lazy_reference,这不是一个好的开始。

这是gcc的第一次运行时的情况,现在已经有很长一段时间了,没有人在非达尔文系统的主线中维护运行时。

我的粗略理解是,苹果实际上并不在Windows上直接使用clang,而是将Objective重写为C,并使用Visual为Windows编译。

你要么开始对clang进行严重的黑客攻击,要么就不用麻烦了。

票数 1
EN

Stack Overflow用户

发布于 2013-07-06 04:57:17

我试着和你最近做的一样,我也发现了类似的结果。核心问题(技术上的,不合法的)是-fnext-runtime在Windows上不受支持,而且很可能永远不会被支持。我一会儿就到-fgnu-runtime

无论您在Windows上编写的Objective程序有多么基本,最终都会有未解决的引用。查看.dll文件,您会发现它们根本不包含链接使用Clang编译的Objective程序所需的一些核心方法。(如果内存可用的话,我至少能够编译一个只有两个未解决的引用的程序)。

因此,在不支持-fnext-runtime的基础上,您可以尝试使用GCC的-fgnu-runtime。当然,你失去了与苹果所有库的兼容性,但你确实可以在Windows上实现目标C程序。GCC最近对目标C运行时进行了升级,使其工作与苹果的目标C运行时几乎完全相同,所以兼容性现在已经不是问题了。

再说一遍,你没有苹果的图书馆,你必须自己写(有谁愿意吗?)但运行时的工作方式是相同的。NSObject (虽然看苹果公司的实施帮助)和常数字符串@“.”对象需要做一些工作,但是一旦有了它们,您就可以构建自己的与Windows兼容的Objective框架。根据经验,我可以告诉你,这是绝对有可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12900596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档