ld:该文件是针对Mac OS X不支持的文件格式构建的

8

我需要在另一台64位计算机上编译共享对象,并构建一个项目。但是我遇到了以下错误:

cc -std=c11 -Wall -Werror -Wextra -pedantic -I./include src/server.c
obj/tftp.o -o bin/server -L./lib64 -lSocketUDP -lAdresseInternet -lpthread
ld: warning: ld: warning: ignoring file ./lib64/libSocketUDP.so, file was
built for unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ) which is not the architecture
being linked (x86_64): ./lib64/libSocketUDP.soignoring file
./lib64/libAdresseInternet.so, file was built for unsupported file format (
0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 ) which is not the architecture being linked (x86_64):
./lib64/libAdresseInternet.so

我的Mac的架构是x86_64,共享对象是在x86_64上编译的。这个编译可以在我的Linux电脑上运行。

这是我的Makefile:

CFLAGS = -std=c11 -Wall -Werror -Wextra -pedantic -I./include
LDLIBS = -L./lib64
LDFLAGS = -lSocketUDP -lAdresseInternet -lpthread

all: obj/tftp.o bin/server bin/client

obj/tftp.o: src/tftp.c
    mkdir -p obj
    $(CC) $(CFLAGS) -c $^ -o $@

bin/server: src/server.c obj/tftp.o
    mkdir -p bin
    $(CC) $(CFLAGS) $^ -o $@ $(LDLIBS) $(LDFLAGS)

bin/client: src/client.c obj/tftp.o
    mkdir -p bin
    $(CC) $(CFLAGS) $^ -o $@ $(LDLIBS) $(LDFLAGS)

clean:
    $(RM) -r obj

distclean:
    $(RM) -r obj bin

谢谢。
2个回答

11

由于这个“其他x86_64计算机”显然正在运行Linux并生成ELF格式的目标文件,因此您无法执行该操作。

0x7F 0x45 0x4C 0x46
0x7F 'E'  'L'  'F'

OSX/iOS 使用 Mach-O 格式 的目标文件,无法链接不同类型的目标文件。

您需要在OSX下编译所有代码。


4

你的SocketUDP库可能是为Linux构建的。Linux和OS X使用不同且不兼容的目标文件,ELF vs. Mach-O。

你还需要在OS X上构建该库。


有没有办法为两个平台编译库? - mathieu_b
@mathieu_b 你可以在Linux系统上交叉编译到外部目标,以构建macOS的动态库。但是,如果你想知道是否可以生成适用于两个平台的单个文件,那是不可能的。 - casey
@casey 好的,我没有库源代码,我的老师编译了它。我需要找到另一个解决方案,谢谢! - mathieu_b
@mathieu_b 你可以在你的Mac上安装VirtualBox,然后在其中安装Linux发行版并运行。 - Mark Setchell
@casey,从技术上讲,有一种名为“fat binaries”的解决方案可以用于跨平台二进制文件。 - Jules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接