Xcode 9 : Swift 3.1로 컴파일 된 모듈은 Swift 4.0에서 가져올 수 없습니다.


79

Xcode 9로 업데이트 한 후 내 프로젝트 중 하나를 빌드하려고했습니다.

FacebookLogin 포드를 사용합니다 . FacebookLogin / LoginButton.swift에 컴파일러 오류가 있습니다.

@testable import FacebookCore
❌ Module compiled with Swift 3.1 cannot be imported in Swift 4.0

내 대상의 빌드 설정에서 Swift 언어 버전은 Swift 3.2 로 설정됩니다 .

스크린 샷 추가

Facebook이 포드를 업데이트 할 때까지 기다려야 할 것 같아요. 아니면 다른 제안?

감사 !


당신은 그것을 설득 할 수 있습니다.
JerryZhou 2017 년

답변:


73

최신 정보:

솔루션은 Swift 5 및 Xcode 11에서도 테스트되고 작동합니다.

실물:

Carthage 를 사용하여 Swift 3.2에서 모듈을 컴파일하는 경우 터미널로 이동하여 다음을 실행해야한다고 추가하고 싶습니다 .

sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer

Xcode 9 명령 줄 도구를 사용하려면 다음을 실행할 수 있습니다.

carthage update NameOfTheLibrary --platform iOS --no-use-binaries

이렇게하면 현재 명령 줄 도구로 라이브러리가 컴파일됩니다. 약간 느릴 수 있지만 이제 프로젝트가 빌드되어야합니다.

노트

안정적인 Xcode 명령 줄 도구를 되돌리고 사용하려면 다음을 실행하십시오.

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

1
Algolia 프레임 워크를 사용하여 동일한 오류가 발생했으며 carthage 및 Xcode 9 명령 도구로 빌드했습니다. 감사합니다
vmeyer 2017-08-10

3
SwiftyJson을 사용하여 나를 위해 일했습니다. 감사!
leandrodemarco

2
Alamofire를 사용하여 나를 위해 일했습니다
pachun

안녕하세요 @xaviPedrals, 도움이 필요합니다. " github.com/swiftingio/SingTest " 프로젝트를 실행하려고 하지만 "Swift 3.1로 컴파일 된 모듈을 Swift 4.2.1 컴파일러에서 가져올 수 없습니다. / Users / aliapple / Desktop / SingTestByAhtazaz / Pods / AudioKit / iOS / AudioKit.framework / Modules / AudioKit.swiftmodule / arm64.swiftmodule ". 이 일에서 나를 도울 수 있습니까?
Ahtazaz 19

안녕하세요 @ Mr.Ahtazaz 그 프로젝트는 2 년 전의 프로젝트이므로 Swift 3에서 만들어지고 컴파일되었을 것입니다. 먼저 프로젝트를 Swift 4 또는 5로 업데이트 한 다음 carthage 명령 carthage update NameOfTheLibrary --platform iOS --no-use-binaries을 실행 하여 라이브러리를 업데이트하면 괜찮을 것입니다.
xavi.pedrals

26

Xcode 9는 Swift 3.2와 swift 4를 모두 이해하는 Swift 4 컴파일러와 함께 제공되며, 심지어 두 가지 버전을 믹스 앤 매치 할 수 있습니다. 불행히도 다른 버전은 지원되지 않습니다.

언어를 Swift 3.2로 설정하더라도 Swift 4 컴파일러를 사용합니다.

cocoapods를 사용하는 경우 pod 파일 끝에 이것을 추가하여 pod가 Swift 3.2 또는 4.0을 사용하도록 할 수 있습니다.

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '3.2'
        end
    end
end

또는 FacebookLogin이 Swift 3.2 또는 4로 업데이트 될 때까지 팟 (Pod)의 파일을 프로젝트에 임시로 직접 넣을 수 있습니다.

참고 : Matt의 피드백에 따라 편집 됨


1
참고-이것은 모든 포드를 Swift 4.0으로 강제함으로써 다소 지나치게 공격적입니다. 포드가 Swift 3과 호환되는 경우 Swift 3.2로 안전하게 이동할 수 있습니다. 4.0으로 넘어 가면 많은 포드에서 컴파일러 문제가 발생할 가능성이 높습니다.
Matt S.

19

빌드하기 전에 타겟을 청소할 수 있습니다. 그것은 나를 위해 잘 작동합니다.


7
나를 위해 일하지 않았고 여전히 다른 해결책을 찾고 있습니다.
Arnaud

11

'Alamofire'를 가리키는 Xcode 9 Beta 3에서 동일한 문제가 발생하여 몇 가지 다른 솔루션을 시도했는데 가장 쉬운 방법은 다음과 같습니다.

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `

11
2017 년이고 버그를 해결하려면 Xcode를 다시 시작해야합니다. 고마워요, 애플. 감사합니다.
Oded Harth

10

"클린 빌드 폴더"를 수행하고 Xcode 9를 다시 시작하면 오류가 해결되었습니다. 또한 오류로 인해 앱이 내 장치 또는 시뮬레이터에서 실행되는 것을 중지하지 않았습니다.


1
"clean build folder": 옵션에 액세스하려면 제품 메뉴를 열고 Option 키를 사용하여 Clean Build Folder 옵션을 표시합니다.
Hans

8

xcode DerivedData 디렉토리로 이동 한 다음 그 안의 모든 파일을 제거하고 프로젝트를 다시 컴파일합니다. 그것은 나를 위해 작동합니다.

기본 DerivedData 디렉토리는 : ~ / Library / Developer / Xcode / DerivedData입니다.


8

Carthage를 사용하는 경우 터미널을 열고 ;

carthage update --platform iOS --no-use-binaries

Pod를 사용하는 경우 터미널을 열고 ;

pod update

(또한 pod에서 작동하지 않는 경우 podfile에서 SWIFT_VERSION을 변경할 수 있습니다. 예 :

config.build_settings['SWIFT_VERSION'] = '3.2'

)

후;

Xcode를 열고 사용하십시오.

Command+Option+Shift+K

여기에 이미지 설명 입력


1
여러 질문에 동일한 답변을 게시하지 마십시오. 하나의 좋은 답변을 게시 한 다음 투표 / 플래그하여 다른 질문을 중복으로 종료합니다. 질문이 중복되지 않는 경우 질문에 대한 답변을 조정하십시오. 참조 meta.stackexchange.com/q/104227/311792
paper1111

@ paper1111 내가 내 대답에 모든 것을 설명하고 작동
SwiftDeveloper

나는 카르타고를 사용하고 있으며 이것이 나를 위해 일한 솔루션입니다. 카르타고 업데이트 "내 프레임 워크"는 그것을 자르지 않았습니다. 카르타고 카탈로그 전체를 업데이트해야했습니다. 영원히 걸렸지 만 트릭을했습니다.
Matan Guttman 2017 년

1
이 솔루션은 저에게도 효과적이었습니다. 확실하게하려면 Command + Option + Shift + K로 빌드 폴더를 정리 한 후 xcode를 닫았다가 다시 시작하십시오.
Torsten Ojaperv

@SwiftDeveloper config.build_settings부분은 어디로 갑니까?
Adrian

4

그것은 나를 위해 작동합니다.

1. Xcode 8에서 프로젝트 정리

2. Xcode 9에서 프로젝트 빌드 또는 실행


3

Xcode 9에서 프로젝트를 정리 한 다음 앱을 실행하면 작동합니다.


2

나는 Xcode 9 GM과 같은 문제가 있었고 이것은 내 문제를 해결했습니다. 프로젝트에서 그것을 제거하고 "Embedded Binaries"로 다시 드래그하십시오.


나는 Alamofire 4.5.1에 ​​문제가 있었고이 페이지의 다른 모든 것을 시도 pod update했지만 결과는 없었습니다. 결국 나는 프레임 워크를 내 프로젝트에 직접 추가하고 작동했던 임베디드 바이너리에 추가했습니다
Heki


1

나는 가지고있다

pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'

내 프로젝트 import FBSDKLoginKit에서 타겟을 청소 한 후 아무런 문제가 없었습니다.

사용중인 포드가 신속하고 베타 포드이므로 swift 4 컴파일러에 문제가있을 가능성이 있으므로 당분간 포드의 Objective-c 버전을 사용해야합니다.


0

포드에서 사용하는 경우 :

  1. 에서 Podfile코멘트 FacebookLogin 포드
  2. 포드 설치

  3. 에서 Podfile주석 FacebookLogin 포드
  4. 포드 설치

  5. 프로젝트를 다시 실행하십시오.

0

제 경우에는 실제 포드가 신속한 3.1을 대상으로하는 사전 빌드 된 바이너리가있는 정적 zip을 참조했습니다. 따라서 유일한 해결책은 xcode 9의 소스로 프레임 워크를 다시 빌드하는 것입니다.

https://github.com/AudioKit/AudioKit/issues/980


AudioKit이 포드 내부에서 참조되는 것과 유사한 문제가 있습니다. 그러나 귀하의 솔루션은 'Framework'에있는 build_frameworks.sh를 참조합니다. 자세한 내용을 추가하세요. 그런 파일을 찾을 수 없습니다.
TomV

podfile이 최신 릴리스를 가리 키도록하십시오. 최신 xcode 9로 빌드 된 버전-/ 빌드 스크립트 변경이 필요하지 않습니다. github.com/AudioKit/AudioKit/releases
johndpope

팁 고마워. cocoapods의 AudioKit 버전을 build_frameworks.sh가있는 최신 버전으로 업데이트해야했습니다. build_frameworks.sh는 Apple이 앱을 거부하는 것을 막기 위해 AudioKit을 '검증'하는 데 필요했습니다.
TomV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.