Xcode 4 ไม่สามารถค้นหาไฟล์ส่วนหัวสาธารณะจากการพึ่งพาไลบรารีแบบคงที่


91

ชื่อเรื่องอื่นเพื่อช่วยในการค้นหา

  • Xcode ไม่พบส่วนหัว
  • ไม่มี. h ใน Xcode
  • ไม่พบไฟล์ Xcode .h
  • ไม่พบไฟล์ปัญหาคำศัพท์หรือตัวประมวลผลล่วงหน้า

ฉันกำลังทำโปรเจ็กต์แอปพลิเคชัน iOS ที่มาจาก Xcode 3 ตอนนี้ฉันได้ย้ายไปที่ Xcode 4 โปรเจ็กต์ของฉันสร้างไลบรารีแบบคงที่จำนวนหนึ่ง

ไลบรารีแบบคงที่เหล่านั้นยังประกาศส่วนหัวสาธารณะและส่วนหัวเหล่านั้นจะถูกใช้โดยรหัสแอปพลิเคชัน ใน Xcode 3.x ส่วนหัวจะถูกคัดลอก (เป็นเฟสการสร้าง) ไปที่public headers directoryจากนั้นในโครงการแอปพลิเคชันpublic headers directoryจะถูกเพิ่มลงในheaders search list.

ภายใต้ Xcode 4 ~/Library/Developer/Xcode/DerivedData/my-projectสร้างไดเรกทอรีจะถูกย้ายไป

ปัญหาคือฉันจะอ้างอิงตำแหน่งใหม่นี้ในการตั้งค่าการค้นหาส่วนหัวได้อย่างไร ดูเหมือนว่า:

  • public headers directoryสัมพันธ์กับDerivedDataไดเร็กทอรี แต่
  • headers search ไดเร็กทอรีสัมพันธ์กับอย่างอื่น (อาจเป็นที่ตั้งโครงการ)

ฉันจะตั้งค่าเป้าหมายไลบรารีแบบคงที่สำหรับการพัฒนา iOS ใน Xcode 4 ได้อย่างไรเพื่อให้แน่ใจว่าไฟล์ส่วนหัวพร้อมใช้งานสำหรับไคลเอนต์ที่ใช้ไลบรารีแบบคงที่เมื่อพยายามรวบรวมแบบอ้างอิง


อาจเกี่ยวข้องกับชื่อพา ธ กรุณาตรวจสอบโพสต์นี้ [ไลบรารีแบบคงที่ใน Xcode 4] [1] [1]: stackoverflow.com/questions/6074576/static-libraries-in-xcode-4/…
Diego Marafetti

คำตอบ:


124

วิธีแก้ปัญหาแต่ละข้อที่ฉันเคยเห็นในปัญหานี้ดูเหมือนจะไม่ดี (การคัดลอกส่วนหัวไปยังโครงการของแอปพลิเคชัน) หรือทำให้ง่ายเกินไปจนถึงจุดที่ใช้งานได้ในสถานการณ์ที่ไม่สำคัญเท่านั้น

คำตอบสั้น ๆ

เพิ่มเส้นทางต่อไปนี้ในเส้นทางการค้นหาส่วนหัวผู้ใช้ของคุณ

"$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

ทำไมถึงได้ผล?

อันดับแรกเราต้องเข้าใจปัญหา ภายใต้สถานการณ์ปกติกล่าวคือเมื่อคุณเรียกใช้ทดสอบโปรไฟล์หรือวิเคราะห์ Xcode จะสร้างโปรเจ็กต์ของคุณและวางเอาต์พุตในไดเร็กทอรีBuild / Products / Configuration / Products ซึ่งพร้อมใช้งานผ่านมาโคร$ BUILT_PRODUCTS_DIR

คำแนะนำส่วนใหญ่เกี่ยวกับไลบรารีแบบคงที่แนะนำให้ตั้งค่าPublic Headers Folder Pathเป็น$ TARGET_NAMEซึ่งหมายความว่าไฟล์ lib ของคุณจะกลายเป็น$ BUILT_PRODUCTS_DIR /libTargetName.a และส่วนหัวของคุณจะใส่ไว้ใน$ BUILT_PRODUCTS_DIR / TargetName ตราบใดที่แอปของคุณมี$ BUILT_PRODUCTS_DIRในเส้นทางการค้นหาการนำเข้าจะทำงานใน 4 สถานการณ์ที่ระบุข้างต้น อย่างไรก็ตามจะไม่ได้ผลเมื่อคุณพยายามเก็บถาวร

การเก็บจะทำงานแตกต่างกันเล็กน้อย

เมื่อคุณเก็บถาวรโครงการ Xcode จะใช้โฟลเดอร์อื่นที่เรียกว่า ArchiveIntermediates ภายในโฟลเดอร์นั้นคุณจะพบ / YourAppName / BuildProductsPath / Release-iphoneos / นี่คือโฟลเดอร์ที่$ BUILT_PRODUCTS_DIRชี้ไปเมื่อคุณเก็บถาวร หากคุณดูในนั้นคุณจะเห็นว่ามี symlink ไปยังไฟล์ไลบรารีแบบคงที่ของคุณ แต่ไม่มีโฟลเดอร์ที่มีส่วนหัว

ในการค้นหาส่วนหัว (และไฟล์ lib) คุณต้องไปที่ IntermediateBuildFilesPath / UninstalledProducts / จำเมื่อคุณได้รับคำสั่งให้ตั้งค่าSkip Installเป็น YES สำหรับไลบรารีแบบคงที่? นี่คือผลของการตั้งค่าที่มีเมื่อคุณสร้างไฟล์เก็บถาวร

หมายเหตุด้านข้าง: หากคุณไม่ได้ตั้งค่าให้ข้ามการติดตั้งส่วนหัวของคุณจะถูกใส่ไว้ในตำแหน่งอื่นและไฟล์ lib จะถูกคัดลอกไปยังที่เก็บถาวรของคุณป้องกันไม่ให้คุณส่งออกไฟล์. ipa ที่คุณสามารถส่งไปยัง App Store ได้ .

หลังจากค้นหามาหลายครั้งฉันไม่พบมาโครใด ๆ ที่ตรงกับโฟลเดอร์ UninstalledProducts อย่างแน่นอนดังนั้นจึงต้องสร้างเส้นทางด้วย "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

สรุป

สำหรับไลบรารีแบบคงที่ของคุณตรวจสอบให้แน่ใจว่าคุณข้ามการติดตั้งและส่วนหัวสาธารณะของคุณถูกวางไว้ใน $ TARGET_NAME

สำหรับแอปของคุณตั้งค่าเส้นทางการค้นหาส่วนหัวของผู้ใช้เป็น "$ (BUILT_PRODUCTS_DIR)" ซึ่งใช้ได้ดีกับบิลด์ปกติและ "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" ซึ่งใช้ได้กับบิลด์ที่เก็บถาวร


สิ่งนี้เกี่ยวข้องกับโฟลเดอร์ DerivedData อย่างไร
Richard Stelling

รุ่นปกติไปที่: DerivedData / WorkspaceName-hash / Build / Products / Debug-iphoneos / TargetName.app --- Archive builds ไปที่: DerivedData / WorkspaceName-hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release-iphoneos / TargetName.app
Colin

3
สำหรับฉันการใช้ "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" กับช่องทำเครื่องหมายแบบเรียกซ้ำไม่ได้ผล ทันทีที่ฉันใช้ "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>" โดยไม่มีค่าสถานะแบบเรียกซ้ำมันก็ใช้ได้สำหรับฉัน
TPoschel

7
โปรดทราบว่าคุณ$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts$(TARGET_BUILD_DIR)เป็นจริง แม้ในขณะเก็บถาวร ;)
Pascal

1
สำหรับฉันใน Xcode 5: $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / include / NAME OF LIBRARY ฉันไม่ได้ตั้งค่าเป็น YES: ค้นหาเส้นทางผู้ใช้เสมอ
xarly

85

ฉันพบปัญหาเดียวกันนี้เมื่อพัฒนาไลบรารีแบบคงที่ของฉันเองและแม้ว่าคำตอบของ Colin จะมีประโยชน์มาก แต่ฉันก็ต้องแก้ไขเล็กน้อยเพื่อให้ทำงานได้อย่างสม่ำเสมอและง่ายดายเมื่อทั้งกำลังรันและเก็บโปรเจ็กต์ภายใต้ Xcode 4 โดยใช้ Workspace

สิ่งที่แตกต่างเกี่ยวกับวิธีการของฉันคือคุณสามารถใช้เส้นทางส่วนหัวของผู้ใช้เดียวสำหรับการกำหนดค่าบิลด์ทั้งหมด

วิธีการของฉันมีดังนี้:

สร้างพื้นที่ทำงาน

  1. ภายใต้ Xcode 4 ไปที่ File, New, Workspace
  2. จาก Finder คุณสามารถลากโปรเจ็กต์. xcodeproj สำหรับทั้งไลบรารีแบบคงที่ที่คุณต้องการใช้และแอพใหม่ที่คุณกำลังสร้างที่ใช้ไลบรารี ดูเอกสารของ Apple สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าพื้นที่ทำงาน: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

การตั้งค่าโครงการห้องสมุดคงที่

  1. ตรวจสอบให้แน่ใจว่าส่วนหัวของไลบรารีแบบคงที่ทั้งหมดถูกตั้งค่าให้คัดลอกเป็น "สาธารณะ" สิ่งนี้ทำได้ภายใต้การตั้งค่าสำหรับเป้าหมายไลบรารีแบบคงที่> สร้างเฟส ในส่วน "คัดลอกส่วนหัว" ตรวจสอบให้แน่ใจว่าส่วนหัวทั้งหมดของคุณอยู่ในส่วน "สาธารณะ"
  2. จากนั้นไปที่ Build Settings ค้นหา "Public Headers Folder Path" และพิมพ์เส้นทางสำหรับห้องสมุดของคุณ ฉันเลือกใช้สิ่งนี้:

รวม / LibraryName

ฉันได้นำสิ่งนี้มาใช้กับ RestKit และพบว่ามันทำงานได้ดีที่สุดกับห้องสมุดคงที่ทั้งหมดของฉัน สิ่งนี้บอกให้ Xcode คัดลอกส่วนหัวทั้งหมดที่เราย้ายไปยังส่วนหัว "สาธารณะ" ในขั้นตอนที่ 1 ไปยังโฟลเดอร์ที่เราระบุไว้ที่นี่ซึ่งอยู่ภายในโฟลเดอร์ Derived Data เมื่อสร้าง เช่นเดียวกับ RestKit ฉันชอบใช้โฟลเดอร์ "include" โฟลเดอร์เดียวเพื่อบรรจุไลบรารีแบบคงที่แต่ละอันที่ฉันใช้ในโปรเจ็กต์

ฉันไม่ชอบใช้มาโครที่นี่เพราะจะช่วยให้เราใช้เส้นทางการค้นหาส่วนหัวของผู้ใช้เดียวในภายหลังเมื่อเรากำหนดค่าโครงการโดยใช้ไลบรารีแบบคงที่

  1. ค้นหา "ข้ามการติดตั้ง" และตรวจสอบว่าได้ตั้งค่าเป็นใช่

การตั้งค่าสำหรับโครงการโดยใช้ไลบรารีแบบคงที่

  1. เพิ่มไลบรารีแบบคงที่เป็นเฟรมเวิร์กภายใต้ Build Phases> Link Binary With Libraries และเพิ่มไฟล์ libLibraryName.a สำหรับไลบรารีแบบคงที่ที่คุณต้องการใช้
  2. ถัดไปตรวจสอบให้แน่ใจว่าโครงการตั้งค่าให้ค้นหาเส้นทางการค้นหาผู้ใช้ ดำเนินการภายใต้การตั้งค่าการสร้าง> ค้นหาเส้นทางผู้ใช้เสมอและตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็นใช่
  3. ในพื้นที่เดียวกันให้ค้นหา User Header Search Paths และเพิ่ม:

    "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include"

สิ่งนี้จะบอกให้ Xcode ค้นหาไลบรารีแบบคงที่ภายในโฟลเดอร์บิลด์ระดับกลางที่ Xcode สร้างขึ้นในระหว่างกระบวนการสร้าง ที่นี่เรามีโฟลเดอร์ "รวม" ที่เราใช้สำหรับตำแหน่งไลบรารีแบบคงที่ซึ่งเราตั้งค่าในขั้นตอนที่ 2 สำหรับการตั้งค่าโปรเจ็กต์ไลบรารีแบบคงที่ นี่เป็นขั้นตอนที่สำคัญที่สุดในการรับ Xcode เพื่อค้นหาไลบรารีแบบคงที่ของคุณอย่างถูกต้อง

กำหนดค่าพื้นที่ทำงาน

ที่นี่เราต้องการกำหนดค่าพื้นที่ทำงานเพื่อสร้างไลบรารีแบบคงที่เมื่อเราสร้างแอปของเรา ทำได้โดยแก้ไขโครงร่างที่ใช้สำหรับแอพของเรา

  1. ตรวจสอบให้แน่ใจว่าคุณได้เลือกรูปแบบที่จะสร้างแอปพลิเคชันของคุณ
  2. จากเมนูแบบเลื่อนลงให้เลือกแก้ไขโครงการ
  3. เลือกสร้างที่ด้านบนสุดของรายการทางด้านซ้าย เพิ่มเป้าหมายใหม่โดยกด + บนบานหน้าต่างตรงกลาง
  4. คุณควรเห็นไลบรารีแบบคงที่ปรากฏขึ้นสำหรับไลบรารีที่คุณพยายามเชื่อมโยง เลือกไลบรารีคงที่ของ iOS
  5. คลิกทั้ง Run และ Archive สิ่งนี้จะบอกรูปแบบในการคอมไพล์ไลบรารีสำหรับไลบรารีแบบคงที่ทุกครั้งที่คุณสร้างแอพของคุณ
  6. ลากไลบรารีแบบคงที่เหนือเป้าหมายแอปพลิเคชันของคุณ สิ่งนี้ทำให้ไลบรารีสแตติกคอมไพล์ก่อนแอ็พพลิเคชันของคุณเป้าหมาย

เริ่มใช้ไลบรารี

ตอนนี้คุณควรจะสามารถนำเข้าไลบรารีแบบคงที่โดยใช้ไฟล์

import <LibraryName/LibraryName.h>

วิธีนี้ช่วยลดความยุ่งยากในการต้องมีเส้นทางส่วนหัวของผู้ใช้ที่แตกต่างกันสำหรับการกำหนดค่าที่แตกต่างกันดังนั้นคุณจึงไม่มีปัญหาในการรวบรวมสำหรับไฟล์เก็บถาวร

ทำไมถึงได้ผล?

ทุกอย่างขึ้นอยู่กับเส้นทางนี้:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

เนื่องจากเรากำหนดค่าไลบรารีแบบคงที่ของเราให้ใช้ "ข้ามการติดตั้ง" ไฟล์ที่คอมไพล์จะถูกย้ายไปยังโฟลเดอร์ "UninstalledProjects" ภายในไดเร็กทอรี build ชั่วคราว เส้นทางของเราที่นี่ยังแก้ไขไปที่โฟลเดอร์ "รวม" ที่เราตั้งค่าสำหรับไลบรารีแบบคงที่และใช้สำหรับเส้นทางการค้นหาส่วนหัวผู้ใช้ของเรา ทั้งสองทำงานร่วมกันทำให้ Xcode รู้ว่าจะหาไลบรารีของเราได้ที่ไหนในระหว่างกระบวนการคอมไพล์ เนื่องจากไดเร็กทอรีบิวด์ชั่วคราวนี้มีอยู่สำหรับทั้งการกำหนดค่าดีบักและรีลีสคุณจึงต้องมีพา ธ เดียวสำหรับ Xcode เพื่อค้นหาไลบรารีแบบคงที่


3
คุณยอดเยี่ยมมาก! สิ่งนี้มีประโยชน์มากและได้ผลตามที่คุณอธิบายไว้
neevek

1
น่ากลัว ฉันจะส่งดอกไม้ไปที่ไหน :)
Ramesh

1
หลังจากตั้งค่าแล้วบางท่านอาจพบ " ... ] ตัวเลือกที่ไม่รู้จักถูกส่งไปยังคลาส 0x ... " ในกรณีที่คุณทำลองเพิ่มสิ่งนี้ในเป้าหมายของโครงการ-> โครงการ -> การตั้งค่าการสร้าง -> การเชื่อมโยง -> ธง Linker อื่น ๆ : -all_load
MkVal

ตรวจสอบให้แน่ใจว่า User Header Search Paths อยู่ในเครื่องหมายคำพูดหากมีช่องว่าง
เคารพ TheCode

Xcode 4.6.2 ไม่ได้เขียนอะไรถึง "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include" ให้ฉัน มีความคิดอะไรที่ฉันขาดหายไป? หรือพฤติกรรม Xcode มีการเปลี่ยนแปลงอีกหรือไม่?
c roald

16

โครงการ Xcode 4 ไม่สามารถรวบรวมไลบรารีแบบคงที่

คำถามที่เกี่ยวข้อง: “ ไม่พบไฟล์ปัญหาคำศัพท์หรือตัวประมวลผลล่วงหน้า” ใน Xcode 4

ข้อผิดพลาดอาจรวมถึง; ไม่มีไฟล์ส่วนหัว "ปัญหาคำศัพท์หรือตัวประมวลผลล่วงหน้า"

แนวทางแก้ไข:

  1. ตรวจสอบ "เส้นทางส่วนหัวของผู้ใช้" ว่าถูกต้อง
  2. ตั้งค่า "ค้นหาเส้นทางผู้ใช้เสมอ" เป็นใช่
  3. สร้างกลุ่มเรียกว่า "Indexing headers" ในโปรเจ็กต์ของคุณและลากส่วนหัวไปยังกลุ่มนี้อย่าเพิ่มในเป้าหมายใด ๆ เมื่อได้รับแจ้ง

11
อีกขั้นตอนที่มองข้ามได้ง่าย แต่สำคัญอย่างยิ่ง: ตรวจสอบให้แน่ใจว่าเส้นทางการค้นหาของคุณมีเครื่องหมายอัญประกาศคู่เพื่อหลีกเลี่ยงการเว้นวรรค ฉันมักจะลืมที่จะทำเช่นนั้น
Brad

ขอบคุณ @ แบรดนี่เป็นคำพูดที่สำคัญและเป็นประโยชน์มาก
Julian D.

15

นี่เป็นกระทู้ที่มีประโยชน์มาก ในการค้นคว้าหาสถานการณ์ของตัวเองฉันพบว่า Apple มีเอกสาร 12 หน้าลงวันที่กันยายน 2012 ชื่อ "การใช้ห้องสมุดคงที่ใน iOS" นี่คือลิงค์ pdf: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

มันง่ายกว่าการสนทนาทางอินเทอร์เน็ตส่วนใหญ่มากและด้วยตัวดัดแปลงขนาดเล็กบางตัวที่อธิบายถึงวิธีการกำหนดค่าไลบรารีภายนอกที่ฉันใช้มันทำงานได้ดีสำหรับฉัน ส่วนที่สำคัญที่สุดน่าจะเป็น:

หากไลบรารีเป้าหมายของคุณมีเฟสบิวด์“ Copy Headers” คุณควรลบทิ้ง ขั้นตอนการสร้างส่วนหัวคัดลอกทำงานไม่ถูกต้องกับเป้าหมายไลบรารีแบบคงที่เมื่อดำเนินการ "เก็บถาวร" ใน Xcode

เป้าหมายไลบรารีแบบคงที่ใหม่ที่สร้างด้วย Xcode 4.4 หรือใหม่กว่าจะมาพร้อมกับเฟส Copy Files ที่กำหนดค่าไว้อย่างเหมาะสมสำหรับส่วนหัวดังนั้นคุณควรตรวจสอบดูว่าคุณมีอยู่แล้วหรือไม่ก่อนที่จะสร้าง หากไม่ทำเช่นนั้นให้กด“ Add Build Phase” ที่ด้านล่างของตัวแก้ไขเป้าหมายแล้วเลือก“ Add Copy Files” เปิดเผยขั้นตอนการสร้างไฟล์คัดลอกใหม่และตั้งค่าปลายทางเป็น "ไดเรกทอรีผลิตภัณฑ์" ตั้งค่า Subpath เป็น / $ {PRODUCT_NAME} การดำเนินการนี้จะคัดลอกไฟล์ไปยังโฟลเดอร์ที่ตั้งชื่อตามไลบรารีของคุณ (นำมาจากการตั้งค่าการสร้าง PRODUCT_NAME) ภายในโฟลเดอร์ชื่อ include ภายในไดเร็กทอรีผลิตภัณฑ์ที่สร้างขึ้น โฟลเดอร์ include ภายในไดเร็กทอรี build products อยู่ในพา ธ การค้นหาส่วนหัวเริ่มต้นสำหรับแอ็พพลิเคชันดังนั้นนี่จึงเป็นตำแหน่งที่เหมาะสมในการใส่ไฟล์ส่วนหัว

ฉันมั่นใจว่าในหลาย ๆ สถานการณ์แนวทางของ Apple อาจไม่เพียงพอ ฉันโพสต์ไว้ที่นี่สำหรับทุกคนที่เพิ่งเริ่มต้นการเดินทางบนเส้นทางสวนห้องสมุดคงที่ - นี่อาจเป็นจุดเริ่มต้นที่ดีที่สุดสำหรับกรณีง่ายๆ


สำหรับผู้ที่ตามลิงค์ด้านบน .. ระวัง: ขั้นตอนที่ขอให้คุณลบไฟล์เทมเพลตดัมมี่เมื่อคุณสร้างโครงการไลบรารี .. อย่าลบไฟล์ * .pch .. มันจะตามมาหลอกหลอนคุณในที่สุด + ข้างต้น คำแนะนำใช้ไม่ได้กับหมวดหมู่ .. มีวิธีแก้ไขสำหรับสิ่งนั้น (เคยเห็นที่ไหนสักแห่ง)
abbood

ขอขอบคุณที่ให้ลิงก์ไปยังแนวทางอย่างเป็นทางการของ Apple สำหรับการสร้างไลบรารีแบบคงที่ ฉันเริ่มต้นด้วยการสร้างห้องสมุดคงที่โดยใช้วิธีนี้แต่ไม่สามารถเก็บถาวรได้ @abbood - ปัญหาในการลบไฟล์ pch ที่สร้างขึ้นคืออะไร?
augusto callejas

ถ้าคุณลบไฟล์. pch .. โปรเจ็กต์ก็จะไม่คอมไพล์ .. (เพื่อจุดประสงค์ในการเก็บถาวรหรืออื่น ๆ ) ..
abbood

มันไม่ได้ผลสำหรับฉันเมื่อฉันลองนำเข้าคำสั่งด้วย "" มันไม่ได้ผลฉันต้องการ <> นอกจากนี้ในขณะที่เก็บถาวรก็ไม่สามารถค้นหาส่วนหัวได้ความคิดใด ๆ ?
user1010819

4

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

ตามเอกสารของ Apple:

ไลบรารีของคุณจะมีไฟล์ส่วนหัวอย่างน้อยหนึ่งไฟล์ที่ไคลเอ็นต์ของไลบรารีนั้นต้องนำเข้า ในการกำหนดค่าส่วนหัวที่จะส่งออกไปยังไคลเอ็นต์ให้เลือกโปรเจ็กต์ไลบรารีของคุณเพื่อเปิดตัวแก้ไขโปรเจ็กต์เลือกไลบรารีเป้าหมายเพื่อเปิดตัวแก้ไขเป้าหมายและเลือกแท็บขั้นตอนการสร้าง หากไลบรารีเป้าหมายของคุณมีเฟสบิวด์“ Copy Headers” คุณควรลบทิ้ง ขั้นตอนการสร้างส่วนหัวคัดลอกทำงานไม่ถูกต้องกับเป้าหมายไลบรารีแบบคงที่เมื่อดำเนินการ "เก็บถาวร" ใน Xcode


3

ดูวิธีแก้ปัญหาของ Jonah Wlliam (กลางคัน) และโมเดล GitHub (ในความคิดเห็น) สำหรับข้อมูลเชิงลึก http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/


4
แม้ว่าวิธีนี้อาจตอบคำถามได้ในทางเทคนิคแต่คุณควรใส่ส่วนสำคัญของบทความที่เชื่อมโยงไว้ในคำตอบของคุณและระบุลิงก์สำหรับการอ้างอิง การไม่ทำเช่นนั้นทำให้คำตอบมีความเสี่ยงจากลิงก์เน่า
jscs

2

เพิ่ม$ (OBJROOT) / UninstalledProducts / exactPathToHeadersไปยังHeader Search Paths

ด้วยเหตุผลบางอย่างช่องทำเครื่องหมายซ้ำไม่ทำงานสำหรับฉันและฉันต้องเพิ่มเส้นทางที่เหลือไปยังตำแหน่งที่ส่วนหัวอยู่

ภายใต้ Log Navigator ใน Xcode (แท็บทางด้านขวาของตัวนำทางจุดพัก) คุณสามารถดูประวัติการสร้างได้ หากคุณเลือกความล้มเหลวในการสร้างจริงคุณสามารถขยายรายละเอียดเพื่อดูsetenv PATHและตรวจสอบเพื่อให้แน่ใจว่าเส้นทางไปยังไฟล์ส่วนหัวของคุณอยู่ที่นั่น


หมายเหตุที่ดีเกี่ยวกับช่องทำเครื่องหมายซ้ำปัญหาเดียวกันที่นี่
Codezy

ใช่ฉันต้องระบุโฟลเดอร์ย่อยเฉพาะด้วยเช่นกันการตรวจสอบการเรียกซ้ำไม่ได้ผล
Oliver Pearmain

ฉันลงเอยด้วยการใช้เส้นทางนี้ (เพียงเพราะมันสั้นกว่า) "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / SubProjectHeaders"
Oliver Pearmain

2

ไม่มีคำตอบใดข้างต้นสำหรับฉันใน Xcode 7 แต่พวกเขาให้ความคิดที่ดี สำหรับผู้ชายที่ดิ้นรนบน Xcode 7 ฉันได้รับการแก้ไขโดยการเพิ่มสิ่งต่อไปนี้ใน User Header Search Paths (รวมเครื่องหมายคำพูด)

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

เปลี่ยนส่วน URL สัมพัทธ์usr/local/includeตามสิ่งที่มีในการตั้งค่า 'Public Header Folder Path' ของไลบรารีแบบคงที่


2

ในกรณีของฉันพื้นที่ทำงานของฉันมีโปรเจ็กต์ไลบรารีแบบคงที่สองโปรเจ็กต์และหนึ่งในนั้นมีการพึ่งพารวมถึงไฟล์ส่วนหัวกับอีกไฟล์หนึ่ง ปัญหาเกิดจากลำดับการสร้าง ในหน้าแก้ไข Scheme ภายใต้ส่วน Build ฉันยกเลิกการเลือกตัวเลือกขนานและจัดเรียงลำดับของเป้าหมายตามการอ้างอิงและแก้ไขโดยปัญหา


1

เพิ่มเส้นทางต่อไปนี้ในเส้นทางการค้นหาส่วนหัวผู้ใช้ของคุณ:

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

นี่คือการยืนยัน!


1

เสี่ยงที่จะแสดงให้เห็นว่าฉันเป็นคนงี่เง่าอะไร ... ฉันทุกข์ทรมานจาก XCode ที่ไม่ยอมหาไฟล์. h ของฉันตลอดบ่าย

จากนั้นฉันก็รู้ตัว

เนื่องจากฉันใช้ "XCode 4" ฉันจึงตัดสินใจ "อย่างชาญฉลาด" ที่จะวางโครงการทั้งหมดไว้ในโฟลเดอร์ย่อยของโฟลเดอร์ชื่อ " โครงการ XCode 4 "

ช่องว่างเหล่านั้นในชื่อโฟลเดอร์ทำให้ XCode สับสนครั้งใหญ่!

การเปลี่ยนชื่อโฟลเดอร์นี้เป็น " XCode_4_Projects " ทำให้ฉันมีความสุข (และสบถน้อยลง) กลับมาในชีวิตของฉัน

เตือนฉันอีกครั้งสิ่งที่ปีนี้คืออะไร

บางทีอาจมีคนบอกนักพัฒนาของ Apple ...


1

คำตอบเหล่านี้ไม่ได้ผลสำหรับฉัน นี่คือสิ่งที่ได้ เพิ่มสิ่งต่อไปนี้ (คัดลอกและวางรวมถึงเครื่องหมายอัญประกาศคู่) ในการตั้งค่าการสร้างเส้นทางการค้นหาส่วนหัวผู้ใช้ของคุณ:

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

สังเกตการเพิ่มไดเร็กทอรีย่อย "/ include /" เมื่อเทียบกับคำตอบอื่น ๆ ตามที่ผู้ใช้รายอื่นได้ชี้ให้เห็นว่าตัวเลือก "เรียกซ้ำ" ดูเหมือนจะไม่ทำอะไรคุณจึงสามารถเพิกเฉยได้

ตอนนี้โครงการของฉันสามารถเก็บถาวรได้สำเร็จเมื่อนำเข้าไฟล์ส่วนหัวไลบรารีแบบคงที่ในรูปแบบต่อไปนี้:

#import "LibraryName/HeaderFile.h"

คุณไม่จำเป็นต้องเปิดใช้งานการตั้งค่าค้นหาเส้นทางผู้ใช้ทุกครั้งเว้นแต่คุณจะรวมส่วนหัวของไลบรารีแบบคงที่ด้วยวงเล็บมุม ( #import <LibraryName/HeaderFile.h>) แต่คุณไม่ควรทำเช่นนั้นจริงๆถ้าไม่ใช่ส่วนหัวของระบบ / กรอบงาน


0

นี่เป็นปัญหาที่เกี่ยวข้องซึ่งนำฉันไปสู่คำถามนี้ดังนั้นฉันจึงเพิ่มโซลูชันของฉันอย่างเคร่งครัดสำหรับเอกสาร / มันสามารถช่วยประหยัดเวลาในการทำงานได้อีกหลายชั่วโมง

ไม่พบไฟล์ DropboxSDK.h

หลังจากพยายามรวบรวม VES สำหรับ iOS มาหลายวันในที่สุดฉันก็พบปัญหานี้ DropboxSDK.hแน่นอนในการเข้าถึงของsearch headersฉันก็เพิ่มไปยังframework headersเส้นทางการค้นหา, include.hโดยตรงและไปทุกประเภทของความยาวที่ดีที่จะลองและได้รับการDropboxSDK.hค้นพบ

วิธีการแก้

EXPLICITYลากDropboxSDK.frameworkไฟล์ลงใน Xcode Project Navigationและตรวจสอบให้แน่ใจว่าCopy Files if neededได้ตรวจสอบแล้ว ตรวจสอบให้แน่ใจว่าเป้าหมายของคุณได้รับการตรวจสอบตามความจำเป็น

คำเตือน

การตั้งค่าตำแหน่งของเฟรมเวิร์กที่ชัดเจนbuild phasesไม่ได้ผลสำหรับฉัน ฉันต้องลาก. Framework ลงใน Xcode และตรวจสอบให้แน่ใจว่าไฟล์ถูกคัดลอกไปยังโครงการของฉัน

# mbp2015 # xcode7 # ios9


0

มีหลายวิธีที่ซับซ้อนในการดำเนินการนี้และมีการนำเสนอวิธีแก้ปัญหาที่ชาญฉลาดมากในชุดข้อความนี้

ปัญหาหลักของการแก้ปัญหาเหล่านี้คือทำให้ความสามารถในการพกพาห้องสมุดของคุณลดลงอย่างมาก

  • ทุกครั้งที่คุณต้องเริ่มโครงการใหม่โดยใช้ไลบรารีของคุณและเก็บถาวรสำหรับ iTunes มันเป็นการกำหนดค่า
  • ทุกครั้งที่คุณต้องการแบ่งปันโครงการของคุณกับทีมหรือลูกค้าของคุณอาจแตกได้ไม่ว่าด้วยเหตุผลใด ๆ (บริบทรุ่น Xcode อะไรก็ได้ .. )

ในที่สุดทางเลือกของฉันก็คือใช้เฟรมเวิร์ก - เสมอ - ตามที่ Apple แนะนำ (วิดีโอ WWDC)

มันง่ายกว่ามากและทำงานเดียวกันในตอนท้าย!

อีกวิธีหนึ่งที่ค่อนข้างหรูหราซึ่งดูเหมือนจะใช้งานได้คือการใช้ Cocoapods ส่วนตัว Cocoapods ทำงานการกำหนดค่าทั้งหมดคัดลอกส่วนหัวและอื่น ๆ

กรอบร็อค!


1
คุณตั้งค่านี้ไว้ที่ไหน simply use frameworks - always -
Neil Faulkner

มันไม่ได้ตั้งค่าทุกที่ เป็นเพียงทางเลือกทางสถาปัตยกรรม เฟรมเวิร์กคือ 'ห้องสมุดสมัยใหม่' ซึ่งเชื่อมโยงและจัดการได้ง่ายกว่ามาก ในช่วงเวลาของข้อความนี้ swift ยังไม่อนุญาตให้สร้างไลบรารีไบนารี
Moose

0

นี่คือสิ่งที่แก้ปัญหาเดียวกันสำหรับฉัน

ฉันมี App Target และ iMessage Extension Target จากนั้นฉันมี 2 SDK (ของฉันเอง) ซึ่ง App Target เชื่อมโยง

ปัญหาคือ: เป้าหมาย iMessage ของฉันยังใช้ 2 SDK ของฉัน (โปรเจ็กต์แยก) แต่ไม่ได้เชื่อมโยงกับพวกเขาในขั้นตอนสร้าง -> เชื่อมโยงไบนารีกับไลบรารี ฉันต้องเพิ่ม 2 SDK ของฉันไปยัง iMessage Target ที่นั่นเพื่อให้ตรงกับเป้าหมายแอปของฉันและตอนนี้ก็เก็บถาวร

ดังนั้นคุณธรรมของเรื่องนี้คือ: หากคุณมีเป้าหมายหลายเป้าหมายเช่นส่วนขยายตรวจสอบให้แน่ใจว่าเป้าหมายทั้งหมดของคุณเชื่อมโยงกับไลบรารีที่พวกเขาต้องการ มันสามารถสร้างและปรับใช้กับโปรแกรมจำลองและอุปกรณ์ได้ แต่ไม่สามารถเก็บถาวรได้


0

อัปเดต: Xcode 9

คำตอบข้างต้นใช้ไม่ได้กับฉันโดยใช้ Xcode 9 แต่คำตอบนี้ใช้ได้ผลอย่างสมบูรณ์สำหรับฉัน ฉันได้เพิ่ม$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include"เส้นทางการค้นหาส่วนหัว" ของฉันแล้วและ Xcode ก็เชื่อมโยงส่วนหัวของไลบรารีแบบคงที่ของฉันโดยไม่มีปัญหา


-18

ช่วยตัวเองแก้ปัญหาและทำสิ่งนี้ = สร้างบัญชีผู้ใช้ใหม่บน Mac ของคุณ - เปิดโครงการภายใต้บัญชีผู้ใช้ใหม่ - ปัญหาทั้งหมดจะหายไป ประหยัดเวลาของคุณและรักษาสุขภาพของคุณ คำตอบโง่ ๆ ทั้งหมดนั้นไม่ช่วยอะไร !!

โชคดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.