我试图在Xcode for OS X 10.9中构建一个命令行应用程序,它包含一个.cpp源文件,该文件使用.asm程序集文件中外部定义的函数。 C ++代码:
#include <iostream>
using namespace std;
extern "C" void NOTHING();
int main(){
NOTHING();
return 0;
}
以下是组装功能:
global NOTHING
section .text
NOTHING:
mov eax, 0
ret
它是一个程序,它只会暂时将零值移入EAX寄存器。我确保在创建.asm源文件时选择NASM程序集。当我点击“播放”时按钮构建可执行文件,Xcode只是声明构建失败,而没有指定原因。
我可以恢复在命令行中完成所有操作,就像在Linux上一样。但是,如果可能的话,我更喜欢开始使用Xcode,因为它结合了许多工具,例如: Git,成为一个单一的开发应用程序。
编辑:在回答之后,我决定放弃Xcode;命令行更简单。根据答案,我写了以下&#39; makefile&#39;对于访问该问题的未来用户:
test: main.cpp asm.o
g++ -stdlib=libstdc++ main.cpp asm.o -o test
asm.o: asm.asm
nasm -f macho64 asm.asm -o asm.o
假定汇编文件是&#39; asm.asm&#39;,C ++&#39; main.cpp&#39;,并且创建的可执行文件名为&#39; test。&#39;在答案中,确保.asm文件中的函数以下划线开头。
答案 0 :(得分:3)
您需要为64位x86-64 Mach-O目标文件指定-f macho64
。正如您已经看到的,Mach-O(函数)符号以下划线为前缀。因此,如果您给出函数定义NOTHING
,则必须在程序集中提供全局_NOTHING
。
此外,具有"C"
链接的函数应指定为:void NOTHING (void);