I recently went through the process of upgrading a
Podfile from a legacy codebase and bumped into an issue with a very simple solution, for those who understand how CocoaPods works under the hood.
I made an example project to show the behaviour, check it out here.
Podfile looked like this:
link_with ['MyProject', 'MyProjectTests'] pod 'AFNetworking' pod 'Kiwi'
(it was actually longer an messier, with random newlines a lot of pods commented out, but no need to inflict you with that)
Apart from the obsolete
Podfile style, there's one big issue; Kiwi should be linked only in the test target, as it is a testing framework.
Podfile into a more semantic and not leaky one was simple:
target :MyProject do pod 'AFNetworking' end target :MyProjectTests, :exclusive => true do pod 'Kiwi' end
So far so good, but at that point after running
pod install the project didn't build anymore! The error was:
ld: library not found for -lPods clang: error: linker command failed with exit code 1 (use -v to see invocation)
This happens to be a pretty common error, specially for newbies, and in the CocoaPods Troubleshooting page there's a solution for it...
...that in our case doesn't work!
After a non irrelevant amount of time spent deleting Derived Data and googling I went back to the error and asked myself: what does
library not found for -lPods mean? It means that something that should be there is not there anymore! And what's missing?__
library not found. _And where are the libraries? In the "Link Binary With Libraries" section of the target build phase. Daaah.
So I took a look at the "Link Binary With Libraries", this is what I found:
If we'd rolled back to the previous version we'd seen this:
Mmm... what is that new
libPods-MyProject static library?
And then I looked at the Pods project:
Can you spot it? There is no Pods target!
And here the solution to the problem: the linker cannot find
libPods because there is no
libPods at all, not anymore. It is just a memory of the previous configuration that CocoaPods didn't remove.
libPods.a from the "Linked Frameworks and Libraries" and everything was running smoothly again.
An extra thing: the same operation needs to be done for the tests target, beacuse of the
link_with ['MyProject', 'MyProjectTests'].
Another extra thing: this memory of
libPods" error happens when you change the name of the target as well.
As we develop advanced badass systems we rely on many tools and frameworks, to delegate work to someone that knows how to do it better. Knowing how those we rely most heavily upon work on a level that is deeper than what's written in the README is invaluable to save time debugging and to get the most out of them.
I challenge you to spend some time reading the source code of one of the tools you use the most. Have fun!