В настоящее время я создаю объектные файлы, используя swiftc
, с:
swiftc -emit-object bar.swift
, где bar.swift
выглядит так:
class Bar {
var value: Int
init(value: Int) {
self.value = value
}
func plusValue(_ value: Int) -> Int {
return self.value + value
}
}
Когда я затем перехожу к связывая это с моим основным объектом для создания исполняемого файла, я получаю следующую ошибку:
$ cc -o foobar foo.o bar.o
duplicate symbol '_main' in:
foo.o
bar.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это означает, что swiftc
добавляет реализацию main
к объектному файлу, что можно подтвердить с помощью:
$ nm bar.o | grep _main
0000000000000000 T _main
Насколько я могу судить, эта добавленная функция делает очень мало:
$ otool -tV bar.o
bar.o:
(__TEXT,__text) section
_main:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp, %rbp
0000000000000004 xorl %eax, %eax
0000000000000006 movl %edi, -0x4(%rbp)
0000000000000009 movq %rsi, -0x10(%rbp)
000000000000000d popq %rbp
000000000000000e retq
000000000000000f nop
....snip...
Есть ли способ сказать swiftc -emit-object
, чтобы не добавлять эту рудиментарную реализацию main