2014-09-16 19 views
7

Moim celem jest, aby uruchomić mój program Swift jak skrypt. Jeżeli cały program jest samowystarczalny, można uruchomić go lubię:xcrun swift z linii poleceń wygenerować <unknown>: 0: błąd: nie można załadować biblioteki współdzielonej

% xcrun swift hello.swift 

gdzie hello.swift jest

import Cocoa 
println("hello") 

Jednakże chcę pójść o krok poza to, i to moduł szybkiego, gdzie mogę importować inne klasy, funcs itd

Więc powiedzmy, że mamy naprawdę dobrą klasę chcemy wykorzystać w GoodClass.swift

public class GoodClass { 
    public init() {} 
    public func sayHello() { 
     println("hello") 
    } 
} 

Teraz chciałbym zaimportować ten jare do mojego hello.swift:

import Cocoa 
import GoodClass 

let myGoodClass = GoodClass() 
myGoodClass.sayHello() 

raz pierwszy wygenerowania .o, lib <> .a, .swiftmodule uruchamiając nich:

% xcrun swiftc -emit-library -emit-object GoodClass.swift -sdk $(xcrun --show-sdk-path --sdk macosx) -module-name GoodClass 
% ar rcs libGoodClass.a GoodClass.o 
% xcrun swiftc -emit-module GoodClass.swift -sdk $(xcrun --show-sdk-path --sdk macosx) -module-name GoodClass 

wreszcie , ja przygotowując uruchomić mój hello.swift (jakby to skrypt):

% xcrun swift -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift 

Ale mam ten błąd:

< unknown >:0: error: could not load shared library 'libGoodClass'

Co to oznacza? Czego mi brakuje. Jeśli pójdę dalej i zrobię link/kompilację podobne do tego, co robisz dla C/C++:

% xcrun swiftc -o hello -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift 
% ./hello 

Wtedy wszystko jest szczęśliwe. Myślę, że mógłbym z tym żyć, ale nadal chcę zrozumieć ten błąd w bibliotece współdzielonej.

Odpowiedz

5

Oto sformatowany, uproszczony skrypt basha, aby zbudować projekt. Twoje użycie -emit-object i późniejsza konwersja nie są konieczne. Twoje polecenie nie powoduje wygenerowania pliku libGoodClass.dylib, który jest wymagany przez linker dla Twojego parametru -lGoodClass po uruchomieniu xcrun swift -I "./" -L "./" -lGoodClass -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift. Nie określiłeś również modułu do połączenia z -module-link-name.

Działa to dla mnie:

#!/bin/bash 

xcrun swiftc \ 
    -emit-library \ 
    -module-name GoodClass \ 
    -emit-module GoodClass.swift \ 
    -sdk $(xcrun --show-sdk-path --sdk macosx) 

xcrun swift -I "." -L "." \ 
    -lGoodClass \ 
    -module-link-name GoodClass \ 
    -sdk $(xcrun --show-sdk-path --sdk macosx) hello.swift 
Powiązane problemy