Xcode custom build configuration causes "library/file not found" for static libraries
As said in similar question iOS Static Library as a Subproject of a Project That Has Custom Build Configurations?, the fix is to add this line
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
to your target's Framework Search Paths
, Header Search Paths
and/or Library Search Paths
Here's something that works for me.
In the project with the Adhoc build configuration, override the "Per-configuration Build Products Path" (CONFIGURATION_BUILD_DIR) and "Per-configuration Intermediate Build Files Path" (CONFIGURATION_TEMP_DIR) for the Adhoc build configuration to use the same folder as the release configuration.
Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
Now when you do an Adhoc build, Xcode will put libFoo.a and Bar.app in the Release-iphoneos folder. The linker will be happy and you can use -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a as usual.
Alternatively, you can add the Release-iphoneos folder to the library search paths for the Adhoc build configuration:
Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
But then you'll have to set a different -force_load for each build configuration:
Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
I have a similar problem using CocoaPods and trying to have more than one Adhoc (or Enterprise, or Beta) configurations.
Here is what seems to work (let's say that both projects are lying in the same xcworkspace):
Add the
subproject
generated lib to themainproject
Link Binary with Libraries.As the configuration
Adhoc
is not known by thesubproject
, Xcode will use theRelease
config as a fallback (or maybe the first config of the list) when building it.The linker will complain because it cannot find the lib… ok, let's handle this one.
Add a Run Script build phase to the
mainproject
, right after the Target Dependencies phase. Enter this script:
if [ "$CONFIGURATION" = "Adhoc" ]; then
echo "====================================="
echo "Copying libPods Release into the Adhoc product build dir!"
echo "====================================="
cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR"
else
echo "No manual lib copy."
fi
This will copy the lib generated by the subproject
Release
build (which will happen when mainproject
is built) in the Adhoc
build directory, so that the linker will find the lib. And we should be good to go! Yeah!