Iphone makefile 在加载时删除最后一个引号

发布于 2024-11-26 08:21:06 字数 3463 浏览 6 评论 0原文

我目前正在尝试构建一个使用 iPhone 工具链开发的 iPhone 应用程序。当我完成创建 makefile 时,当它尝试一起加载我的 .o 文件时,它给了我这个错误:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file

在查看它试图执行的 shell 代码时,我确定它删除了最后一个引号,所以我做了一个快速修复我的生成文件。加载后,它给了我以下错误:

未定义的符号:

  "_main", referenced from:
      __start in crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** ["Autotune] Error 1

如果我正确地阅读了它,它无法找到我的主要功能,但它在 main.mm 中明确定义。我想保持我的项目闭源,但我愿意展示我的代码的某些非重要部分。我不明白为什么它没有编译;它在 Xcode 上运行良好。我对 Makefile 的更改是否以某种方式导致它无法加载 _main 符号?我该如何解决这个问题?我很困惑。

这是我的 Makefile:

PROJECTNAME="MyAppName"
APPFOLDER=$(PROJECTNAME).app
INSTALLFOLDER=$(PROJECTNAME).app

CC=arm-apple-darwin9-gcc
LD=$(CC)
LDFLAGS = -arch arm -lobjc 
LDFLAGS += -framework CoreFoundation 
LDFLAGS += -framework Foundation 
LDFLAGS += -framework UIKit 
LDFLAGS += -framework QuartzCore
LDFLAGS += -framework CoreGraphics 
LDFLAGS += -framework CoreAudio 
LDFLAGS += -framework AudioToolbox
LDFLAGS += -framework AVFoundation
LDFLAGS += -L"/usr/lib"
LDFLAGS += -F"/System/Library/Frameworks"
LDFLAGS += -F"/System/Library/PrivateFrameworks"
LDFLAGS += -bind_at_load
LDFLAGS += -multiply_defined suppress

CFLAGS = -I"/var/include" 
CFLAGS += -I"/usr/include"
CFLAGS += -I"/var/include/c++/4.0.0"
CFLAGS += -I"/var/include/c++/4.0.0/arm-apple-darwin9"
CFLAGS += -I"./Classes"
CFLAGS += -F"/System/Library/Frameworks" 
CFLAGS += -F"/System/Library/PrivateFrameworks" 
CFLAGS += -DDEBUG -Wall 
CFLAGS += -DMAC_OS_X_VERSION_MAX_ALLOWED=1050

BUILDDIR=./build/2.0
SRCDIR=./Classes
RESDIR=./Resources
OBJS=$(patsubst %.m,%.o,$(wildcard $(SRCDIR)/*.m))
OBJS+=$(patsubst %.mm,%.o,$(wildcard $(SRCDIR)/*.mm))
OBJS+=$(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))
OBJS+=$(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp))
RESOURCES=$(wildcard $(RESDIR)/*)

all:    dist

CFLAGS += -include Prefix.h


$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^

%.o:    %.m
    $(CC) -c $(CFLAGS) $< -o $@

%.o:    %.mm
    $(CC) -c $(CFLAGS) $< -o $@

%.o:    %.c
    $(CC) -c $(CFLAGS) $< -o $@

%.o:    %.cpp
    $(CC) -c $(CFLAGS) $< -o $@

dist:   $(PROJECTNAME)
    /bin/rm -rf $(BUILDDIR)
    /bin/mkdir -p $(BUILDDIR)/$(APPFOLDER)
    /bin/cp $(RESDIR)/* $(BUILDDIR)/$(APPFOLDER)
    /bin/cp Info.plist $(BUILDDIR)/$(APPFOLDER)/Info.plist
    @echo "APPL????" > $(BUILDDIR)/$(APPFOLDER)/PkgInfo
    /usr/bin/ldid -S $(PROJECTNAME)
    /bin/cp $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)

install: dist
    /bin/cp -r $(BUILDDIR)/$(APPFOLDER) /Applications/$(INSTALLFOLDER)
    @echo "Application $(INSTALLFOLDER) installed"
    killall SpringBoard

uninstall:
    /bin/rm -fr /Applications/$(INSTALLFOLDER)
    killall SpringBoard

reinstall: dist
    /bin/rm -fr /Applications/$(INSTALLFOLDER)
    /bin/cp -r $(BUILDDIR)/$(APPFOLDER) /Applications/$(INSTALLFOLDER)
    @echo "Application $(INSTALLFOLDER) installed"

clean:
    @rm -f $(SRCDIR)/*.o
    @rm -rf $(BUILDDIR)
    @rm -f $(PROJECTNAME)

需要注意的是,Prefix.h 曾经是一个预编译头,但我只是将其更改为头文件,并告诉 make 将其包含在我的所有源文件中。

我针对不包括最终引用的问题所做的快速修复是:

将:更改

$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^

为:

$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^"

在那篇长帖子之后重申我的问题。我对 Makefile 的更改是否以某种方式导致它无法加载 _main 符号?

I am currently trying to build an iPhone app that I have developed using the iPhone toolchain. When I finished creating the makefile it was giving me this error when it tried to load my .o files together:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Upon looking at the shell code it was trying to execute, I determined that it dropped the last quote so I made a quick fix to my makefile. Upon loading, it gave me the following error:

Undefined symbols:

  "_main", referenced from:
      __start in crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** ["Autotune] Error 1

If I read this correctly it cannot find my main function, but it is clearly defined in main.mm. I would like to keep my project closed source, but I am willing to show certain, non-vital parts of my code. I don't see why it is not compiling; it worked fine on Xcode. Did my change to the Makefile somehow cause it to not load the _main symbol? How can I fix this problem? I am quite stumped.

Here is my Makefile:

PROJECTNAME="MyAppName"
APPFOLDER=$(PROJECTNAME).app
INSTALLFOLDER=$(PROJECTNAME).app

CC=arm-apple-darwin9-gcc
LD=$(CC)
LDFLAGS = -arch arm -lobjc 
LDFLAGS += -framework CoreFoundation 
LDFLAGS += -framework Foundation 
LDFLAGS += -framework UIKit 
LDFLAGS += -framework QuartzCore
LDFLAGS += -framework CoreGraphics 
LDFLAGS += -framework CoreAudio 
LDFLAGS += -framework AudioToolbox
LDFLAGS += -framework AVFoundation
LDFLAGS += -L"/usr/lib"
LDFLAGS += -F"/System/Library/Frameworks"
LDFLAGS += -F"/System/Library/PrivateFrameworks"
LDFLAGS += -bind_at_load
LDFLAGS += -multiply_defined suppress

CFLAGS = -I"/var/include" 
CFLAGS += -I"/usr/include"
CFLAGS += -I"/var/include/c++/4.0.0"
CFLAGS += -I"/var/include/c++/4.0.0/arm-apple-darwin9"
CFLAGS += -I"./Classes"
CFLAGS += -F"/System/Library/Frameworks" 
CFLAGS += -F"/System/Library/PrivateFrameworks" 
CFLAGS += -DDEBUG -Wall 
CFLAGS += -DMAC_OS_X_VERSION_MAX_ALLOWED=1050

BUILDDIR=./build/2.0
SRCDIR=./Classes
RESDIR=./Resources
OBJS=$(patsubst %.m,%.o,$(wildcard $(SRCDIR)/*.m))
OBJS+=$(patsubst %.mm,%.o,$(wildcard $(SRCDIR)/*.mm))
OBJS+=$(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))
OBJS+=$(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp))
RESOURCES=$(wildcard $(RESDIR)/*)

all:    dist

CFLAGS += -include Prefix.h


$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^

%.o:    %.m
    $(CC) -c $(CFLAGS) 
lt; -o $@

%.o:    %.mm
    $(CC) -c $(CFLAGS) 
lt; -o $@

%.o:    %.c
    $(CC) -c $(CFLAGS) 
lt; -o $@

%.o:    %.cpp
    $(CC) -c $(CFLAGS) 
lt; -o $@

dist:   $(PROJECTNAME)
    /bin/rm -rf $(BUILDDIR)
    /bin/mkdir -p $(BUILDDIR)/$(APPFOLDER)
    /bin/cp $(RESDIR)/* $(BUILDDIR)/$(APPFOLDER)
    /bin/cp Info.plist $(BUILDDIR)/$(APPFOLDER)/Info.plist
    @echo "APPL????" > $(BUILDDIR)/$(APPFOLDER)/PkgInfo
    /usr/bin/ldid -S $(PROJECTNAME)
    /bin/cp $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)

install: dist
    /bin/cp -r $(BUILDDIR)/$(APPFOLDER) /Applications/$(INSTALLFOLDER)
    @echo "Application $(INSTALLFOLDER) installed"
    killall SpringBoard

uninstall:
    /bin/rm -fr /Applications/$(INSTALLFOLDER)
    killall SpringBoard

reinstall: dist
    /bin/rm -fr /Applications/$(INSTALLFOLDER)
    /bin/cp -r $(BUILDDIR)/$(APPFOLDER) /Applications/$(INSTALLFOLDER)
    @echo "Application $(INSTALLFOLDER) installed"

clean:
    @rm -f $(SRCDIR)/*.o
    @rm -rf $(BUILDDIR)
    @rm -f $(PROJECTNAME)

It is important to note that Prefix.h used to be a precompiled header but I just changed it to a header file and told make to include it in all my source files.

The quick fix that I made for the problem of not including the final quote was:

changing:

$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^

to:

$(PROJECTNAME): $(OBJS)
    $(LD) $(LDFLAGS) -o $@ $^"

To restate my question after that long post. Did my change to the Makefile somehow cause it to not load the _main symbol?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

还不是爱你 2024-12-03 08:21:06

我发现 PROJECTNAME 给出的实际应用程序名称中有一个空格。我删除了快速修复的空间,并将 LD 从 apple-arm-darwin9-gcc 更改为 apple-arm-darwin9-g++。之后它起作用了。

I figured it out my actual app name given by PROJECTNAME had a space in it. I removed the space my quick fix and changed LD from apple-arm-darwin9-gcc to apple-arm-darwin9-g++. after that it worked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文