Apple Math -O Linker warning in Xcode 5 - ios

I get the warning ld: warning: directory not found for option '-L "path/to/library".
This stared happening after I added a library into project.
I tried clean, build and removing unnecessary paths from App Target->Build Settings->Library Search Paths.
None of them worked.

I found below answer on apple developer forum.
The bug is due to an error in XCode 5 when it deals with the user adding new files or folders to the project.
Xcode is modifying the Library Search Paths build setting, and making a mess of it.
Instead of adding $(SRCROOT)/ it is adding fully rooted paths to all new items, and adding random amounts of /// into other elements of the string.
It also seems to be duplicating source paths in some instances, probably because it's broken the existing ones, and thinks they need adding again.
The solution:
Copy out your Library Search Paths string into a text editor.
Remove any fully rooted paths that shouldn't be there, and replace them with the usual $(SRCROOT)/MyFiles/ type paths.
Remove all extraneous slashes and make sure each path has a " character at beginning and end to protect against spaces in filenames.
Paste the edited string back into Build Settings.
Clean, then Build. Should be back to normal.

Related

Xcode keep using old framework version

From the beginning of my project, I use a custom framework, let's call it "custom.framework". But there was a bug in this framework and now I want to use another version of the "custom.framework".
At first, I simply removed the "custom.framework" file from my project and added the new one. But nothing changed, the bug was still there.
After multiple tries and hours, I understood that Xcode add the old version in memory and used this one instead of the new version. I know it because in the new version I added a method and when I cmd+click the class I've add the method into, it's not there and the file's path is unavailable.
Searching through the web, I tried to change some version parameters to my framework projects: Compatibility version, Curent Library version, Framework version. But this didn't change anything to Xcode which keeps using the old version.
I also tried to make the framework's project as a sub-project and add resulting framework as a dependency to my target. It worked well, but as the framework's project is on a separated remote git repository, I don't think this is an acceptable solution.
So my last try was to build a "custom2.framework", to force Xcode to use the real file and not some cached version. But again, it doesn't work and when building I get errors telling me that all my classes in custom2.framework are duplicated symbols of its cached version of "custom.framework".
So my question is simple: how can I finally tell Xcode to deleted its cached old version and let me use the file I gave him? I already tried to delete my project's derivedData but it seems cached frameworks aren't there.... I'm so desperate :(
Edit: Here are 2 screenshots to illustrate the issue
First screenshot is the path as shown by Xcode when I opened the file from the .framework object in the project navigator.
Second screenshot is the path as shown by Xcode when I opened the file from a cmd+click to a "DCEquipmentManager" in code.
As you can see, the framework linked with the code is not the framework in the project.
it seems problem with binding in new framework, your project still linked with old framework files.
try to remove all files and folder related to your "custom.framework and also remove path for that framework from project setting--> build setting --> search Path
Then after Drag and Drop Your "custom.framework" files in project.
it works for me.hope it resolve your problem.
Please try to clear derrived data:
Window -> Organizer
at the right side you will see projects list. Find your project and tap on it. I the top part of window you will see button delete in front of Derrived data, tap on it.
I guess it will solve your problem.
It might sound silly, but sometimes restarting XCode or the whole machine fix things.
Did you remove the old framework from Build Phases --> Link Binary With Libraries?
Use Clean Build Folder: option-shift-command-K, or select it from the Product menu when holding down the alt/option key.
First lets say something upfront. The build stage is a(are) command line tool(s) that is managed by Xcode according to your Build Settings.
So when Xcode doesn't find your Framework - the Build System will usually also not find it. This forces you to act but may end up in confused Xcode to catch an older reference.
Yes it may happen that the Header Xcode is pointing to is correct but the build system still uses an old copy somewhere. An outdated copy can dangle around literally anywhere depending on the steps you took before.
It (Xcode) assumes where it is located but the Build System still uses another version or the Search Paths just pointing in the wrong Locations even if they are visible to you and even your Framework icons are visible in the lists. So when you erase the last build you actually only force Xcode to rebuild from the known arguments, the settings stay the same, the lists stay the same. Even restarting Xcode does not change anything, the problem persists.
Ergo: Compiler Instructions, Xcode settings and Build System settings don't match what the code tells with #import <NAME/Name.h>
So you will check at least those 6 stages again:
Is your Framework Header File published in your Framework project?
are Build Settings really pointing to the right Framework Search Paths or System Framework Search Paths?
Is your Framework in linking list?
Is your Framework in Embed Framework list?
Does your framework appear in the Framework Group Folder in Workspace/Project Browser? (usually the very last Group Folder in the Browser below all your other files)
Is my Folder Structure correct?
At least 1 to 4 must be right otherwise it will fail.
Here a random list of common causes
Framework is located outside your Source Paths structure
Structure got changed after you added it to the project
You use Workspace's where Framework development and Final Application can appear side by side but you assume Xcode uses this to change its Search Paths
The contained build settings are misleading from former drag and drop operations, ending up tricking Xcode in the "wrong" corner. In this case recreating a project is just one of the possible ways to fix it but not the solution.
Also dragging a Framework into your Project > General or separated in Build Phases > Link Binary list or Embed Framework lists does not make Xcode aware of the wrong Build Settings.
The Linking works, embedding works, but compiling does not. The Header information is still missing.
The solution must be to correct your Build Settings.
As mentioned above Build System and Xcode are two different things. In particular only setting the right Framework Search Paths will solve those issues, even if you managed to kick your derived data manually.
Erasing Derived data?
Derived data is the place where precompiler collects data to compile. So it can be seen as expression of what all the settings are told to do. Erasing it does of course not change the settings but may fix inconsistencies related to former Build Settings. It would erase the derived data and rebuild from the Build System Settings you gave.
Correcting Linking?
Also Linking is not the same as making Xcode aware of the desired Headers. Linking is for your final Product to know where Symbols are to call on them at runtime, it does not change Framework Search Paths and System Framework Search Paths, they stay the same as given.
But it is not wrong to start fixing first with
Product > Clean Build Folder, it forces your build to parse all and compile all again on the next Build.
When the troubles come up because of folder structure in parallel or Frameworks are simply placed outside the Source Directory then you must point to them directly or relative.
Most likely you should place one extra entry in your Framework Search Paths like $(SRCROOT)/../Yourframeworksource/build/Debug. expression to point to relative higher folder structure.
Needless to say that a Release Build likely needs another entry ending in "/Release".Hint: Well you can have different Search Paths for different Compile Schemes..
This works particular good after you cleaned Linking List, Embed Frameworks List and then also check the very last Group Folder "Frameworks" for double entries to drag and drop a fresh Framework reference in there.
How to know if leading /../ will fix it?
Click on the dropped Framework Icon inside the workspace Framework Group Folder (lower most) while your Project is the active selected to work on, now watch for the relative Path information on the very upper right side of Xcode, if there is some /../ you know you need it as well.
Sorting of Framework Search Paths
play a role of course, just the same as #import/#include rule sorting matters.
Remember the first found, first wins rule because often we use #import that works different then #include but ignores second attempts to declare. This leads to once wrongfully declared headers to hide corrected declarations later on in parsing that share the same filename or define rules
#ifndef xyz
#define xyz
// all your code here.
// a second read attempt would be ignored
// a second read is hidden also when you use #include then.
#endif
So you can sort those entries either by code and/or in the build settings if needed because of course it matters what is declared before other declarations depend on it.

Xcode project/app name with spaces issue - framework not found

Is it possible that Xcode 6.1 doesn't finds my previously imported frameworks because of my 3 word app name? I'm using Parse and never ever had any problems with it. But actually when I open my project in Xcode I got an error that the framework doesn't found, which is absurd because it worked well earlier and I don't removed it. However if I delete the frameworks and add them again everything is fine. Am I doing something wrong or is it an Xcode bug?
ld: warning: directory not found for option '-F/Users/donip/Documents/Fl Travel Guide/Fl'
ld: warning: directory not found for option '-FTravel'
ld: warning: directory not found for option '-FGuide'
ld: framework not found ParseFacebookUtils
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Simply enclose your framework path in double quotes(""). For example:
"$(SRCROOT)/my framework/path"
"directory not found for option '-F/..."
Here '-F/..' shows it's a Framework Error. There could be 2 reasons for this.
Missing escape "\" character.
It seems search paths are broken up on several lines in the Framework Search Path or Library Search Paths. Or having spaces in path. Add the escape "\" character to fix it.
Click on your project (targets)->
Click on Build Settings->
Under Frameworks Search Paths, delete the paths.
I'm sure this is Xcode bug. Since a lot of other developers have problems with
frameworks paths, such as Absolute path issues
I'm sure You will find other issues too in SO.
I have encountered this issues myself too.
Best solution for me just commit working project files, and then
reset/revert new/wrong changes which done by Xcode.
For me, I had to delete (using Terminal):
/Users/xxxxxxx/Library/Developer/Xcode/DerivedData/PROJECT_NAME
Using:
rm -r PROJECT_NAME-xxxxxxxx
If you have multiple projects with the same name in the /DerivedData folder, first try deleting all but the most recent one. If that does not work, try deleting all projects including the most recent.
Just update your library location to such a path which doesn't have any spaces inbetween. For example, instead of :
'-F/Users/donip/Documents/Fl Travel Guide/Fl'
use
'-F/Users/donip/Documents/FlTravelGuide/Fl'
Just change the folder name, available in that path, then make the same change in project settings in Library Search Paths and Header Search Paths, wherever its been referred.
Hope this will resolve your query.

Weird Xcode linker error

I'm getting this Xcode error:
ld: warning: directory not found for option '-L/Volumes/Macintosh HD2/Users/dgd/Dropbox/Websites/iCalTools.com/CalendarFilter/iCal'
ld: warning: directory not found for option '-LFilter/TestFlightSDK3.0.0'
ld: library not found for -lTestFlight
clang: error: linker command failed with exit code 1 (use -v to see invocation)
My code is at this path:
/Volumes/Macintosh HD2/Users/dgd/Dropbox/Websites/iCalTools.com/CalendarFilter/iCal Filter
and it appears Xcode is choking on the 2nd blank for some reason and incorrectly splitting the path to TestFlight.
The really strange part is if I delete the TestFlight API and it's Library Search Paths, then add it back in, it compiles and runs fine, even though the library search paths appear to be broken at the space still:
Everything continues to work until I close the project and reopen it. Then I have to remove and readd TestFlight again.
(One more note, I tried to remove the blank from the directory but ran into so many more Xcode and git problems trying to rename it that I gave up and reverted back. At some point during that process I ended up with exactly the same problem with Xcode choking on the blank in "Macintosh HD2" instead)
EDIT
I emailed TestFlight support about this issue and received the response below which fixed the problem. I had tried most of these steps before except for deleting the files from disk (I did have several old copies of TestFlight on disk, but not in the project) and possibly checking the Copy Items box. I still don't know what the problem really was and consider this a workaround, so I'm not adding this as an answer. Maybe someone will be able to explain what's going on here.
Sorry for the trouble.
These errors usually come up if there are issues with the Library Search Paths. Please remove the "Filter/TestFlightSDK3.0.0" line and then do the following:
Open Xcode and select all the TestFlight SDK files in your project (libTestFlight.a, TestFlight.h, TestFlight+AsyncLogging.h, TestFlight+ManualSessions.h)
Delete all the selected files by choosing the move to trash option
Open your project in Finder (Right click the main project folder and select show in finder)
Double check for TestFlight SDK files and delete any found.
Download the TestFlight SDK v3 again and extract the zip
Drag and drop the contents of the SDK folder into your project. At the adding files prompt, check off the defaults (Copy items, Create groups, add target)
Clean the build and attempt to create a new IPA
Try using quotation marks to separate items in the path.
$(inherited) "$(SRCROOT)" "$(SRCROOT)/../Dependencies/Frameworks"/** "$(SRCROOT)/MobileAppTracking-ios" "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"
I have a project where our Framework search path looks like the above. That may help with paths that have spaces. If all else fails, can you try escaping spaces or moving your libraries to a path that does not include a space?
For paths in Xcode containing blanks just put quotes around the path (same for all settings that take paths: includes, search paths, etc.
"/Volumes/Mac HD/Users/The Count of Tuscany/Source/My Stuff/"
I got the same type of issues with it.
Just go to Build Settings. Type "search path" in the search box provided. Then see the references for your third party library. Delete the values.
Now go to your project file menu which displays your program files. Then delete the third party libraries for which you have linker errors. Make sure to backup these, as you'll need them in next step.
Now drag the same libraries you have in other folder or backup folder into your xcode project.
Now build.
I solved the same by the above steps. It usually happens when you move your xcode project from from one user/ mac to another. Or else if the libraries are missing as per the references.

directory not found Apple Mach-O linker warning but Library Search Path and Framework Search Path are empty

I'm getting these messages:
ld: warning: directory not found for option '-F"/Users/joel/Development/GHaikuTabbed"'
ld: warning: directory not found for option '-F"/Users/joel/Development/GHaikuTabbed/../../../Downloads"'
But when I go to Build Settings (as suggested at ‘ld: warning: directory not found for option’), Library Search Path and Framework Search Path are empty, so there's nothing to delete.
Thoughts on other things I can do to get rid of this warning?
Here is a description how to avoid a problem based on Apple Dev Forum posted before. It works for me so I repost description for those people who don't want to go and register at the forum.
The bug is due to an error in XCode 5 when it deals with the user adding new files or folders to the project.
Xcode is modifying the 'Library Search Paths' build setting, and making a god-awful mess of it.
Instead of adding $(SRCROOT)/ it is adding fully rooted paths to all new items, and adding random amounts of /// into other elements of the string.
It also seems to be duplicating source paths in some instances, probably because it's broken the existing ones, and thinks they need adding again.
The solution:
Copy out your Library Search Paths string into a text editor.
Remove any fully rooted paths that shouldn't be there, and replace them with the usual $(SRCROOT)/MyFiles/ type paths.
Remove all extraneous slashes and make sure each path has a " character at beginning and end to protect against spaces in filenames.
Paste the edited string back into Build Settings.
Clean, then Build. Should be back to normal.
This error may well recur if you add new files to your project, so beware.
My project.pbxproj looked like this:
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\\\"$(SRCROOT)/AdMob-v6.4.1\\\"",
"/MyProject/AdMob-v6.5.1",
);
I closed MyProject, deleted the line containing AdMob-v6.4.1, reopened the project, performed a "validate project settings", cleaned, and built, and now all is well.
Yeah, Xcode is jenky sometimes.
Did you try cleaning your build (Product > Clean Build Folder / Shift-Cmd-K) and trying again?
Another thing you can do is to search for the two entries in [project_name].xcodeproj/project.pbxproj, remove them, close XCode, re-open, Clean Build Folder and try again.
Good luck!
To summarise what #user2963906 is suggest, I show my solution to this problem, which I think much easy.
I assume that you have all your files and libraries in your project folder.
Open your project Targets
Find Search Paths topic and Library Search Paths
Choose and remove all paths here
Then add path like this: $(SRCROOT)/"Your App Name"
In the same window change drop-down list from the right from non-recursive to recursive
Shift-⌘-K and Run your project
I found a solution for this with my case on the iOS Developer Forums. It happened to me with Xcode 5. See Massive Linker Error Warnings (directory not found for option) yet . For me it was caused by Xcode 5 junking up the "Library Search Paths" build setting.
Easy Solution :
It's work for me
when you want to add new files or folders to the project through xcode 5 and above error display.Just follow below simple step.(Please don't forgot to get backup of your project).
Open your Project in Old XCode (I recommend XCode 4.6.3)
Add your files or folder. (it will not mess your library search path as it mess in XCode 5)
Close the old xcode and open your project with XCode 5 and start to code.
I faced the same problem but was unable to fix it as per the steps since no library folders were getting displayed in the Project properties window.
So I solved it in another way (you need to be able to use the Terminal and the VIM editor. Also take a backup of the project just in case)
Open a Terminal window
Go to the project folder.
The XCode project is a folder. use cd project name to go into that folder.
use vim to open and edit the project.pbxproj file.
Remove reference to the offending lines by searching using / and using the dd command on that line to delete it.
Save using :wq command
Open the project in XCode and build. Works like a charm.
I had to escape any spaces with a \
So for example:
/Users/Me/Folder\ with\ spaces\(and\ brackets\)
in Library Search Paths
This worked for me :
Create this real directories (with no content), add them to project, remove via remove reference, clean, delete for real
In project folder -> target , under 'Build Setting' search 'library search paths' and simply delete previous path in Debug & Release area.
Now add the line below line using + symbol
$(PROJECT_DIR)/Library
Note: After adding the above line click out from popup. its automatically display the full path.Then check this path with your Finder if any correction add after the $(PROJECT_DIR)/
Clean , Build and Run … Simple its cleared that error. :)
-Anup

Xcode 4.6 won't archive a target with dependent libraries

Trying to archive a target results in dependent libraries being unable to find public header files during compile. I am seeing an error like this during Archive.
fatal error: 'OmniBase/NSException-OBExtensions.h' file not found
#import <OmniBase/NSException-OBExtensions.h>
^
1 error generated.
This issue seems to be related to Xcode 4.6 not escaping header search paths properly. No matter how hard I try to escape the search path it is always split at the space. This issue did not appear in previous versions of Xcode. I was able to correct this issue by removing the space from the Scheme Name that I was building with.
It seems the only way to correct this problem is to make sure your search path has no spaces. You can inspect your search paths by looking at the compile arguments in the Error Log. Every argument starting with -I is a search path.
Try putting the header search path in quotes:
"$(BUILD_ROOT)/../path/to/headers"

Resources