cocoa-touchcocoapodsrestkitcocoalumberjackxcode7-beta5

RestKit and CocoaLumberjack integrated as frameworks in Xcode7


I'm working on a project that uses both RestKit and CocoaLumberjack. The project also uses some other pods, some of them only exist in swift. I use cocoapods 0.38.2 for dependency management, my podfile looks like this (removed other pods for readability):

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'
use_frameworks!

pod 'RestKit'
pod 'CocoaLumberjack'

I need to use use_frameworks! because of those other pods that are swift-only. I try to compile this using Xcode7 beta 5, I get the following errors:

"_OBJC_CLASS_$_DDLog", referenced from:

  objc-class-ref in RKLumberjackLogger.o

ld: symbol(s) not found for architecture x86_64

So I took a look into the offending file and found this:

#if __has_include("DDLog.h")
#import "RKLumberjackLogger.h"
#import "DDLog.h"

Looks like the entire file resolves to nothing if the DDLog.h is not present, in which case I think the RestKit logging falls back to NSLog or whatever. Otherwise, the Lumberjack logging is used, which is what I want.

After some investigation, my suspicion is that the RestKit somehow sees the CocoaLumberjack headers (where the DDLog.h is), but is not properly linked against it when the project is built. Feel free to question this in case you have better ideas, but I can confirm that going to the CocoaLumberjack sources and manually adding DDLog.m as a member to the RestKit framwork target allows me to compile the project properly.

So, my question is, what is the correct way of fixing this? RestKit is not directly dependent on CocoaLumberjack, but tries to detect it and use it if possible, but fails miserably. Is there a way to link RestKit with Lumberjack from my project level so I don't have to modify the pods?

Example project can be found here


Solution

  • Your suspicion is correct.

    RestKit somehow sees the CocoaLumberjack headers (where the DDLog.h is), but is not properly linked against it when the project is built

    This is a problem with RestKit and everything that you would do within your own project would be a workaround. So arguably, there is no single correct way to fix this in your project.

    I have filed a Pull Request with a fix for this issue.


    Update:

    The pull request has been merged, but at the time of writing this update, no new version of RestKit has been released yet.

    pod "RestKit", :head, :subspecs => ['Core', 'CocoaLumberjack']

    RestKit's Lumberjack logging functionality has been moved into a separate subspec that you have to specify if you want to use it. :head will tell CocoaPods to use the current master instead of a released version.