Why is a static library's header file not found for archiving? Why is a static library's header file not found for archiving? ios ios

Why is a static library's header file not found for archiving?


By default Xcode puts the build products into $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME), this equates to build/Release-iphoneos for instance. This is the folder that the products get built into and where the headers will get copied to.

When we duplicate the Release configuration to say one called "App Store", Xcode now builds into build/App Store-iphoneos. The problem is, really, that the static libraries are still being built with their Release configuration, into the Release build folder.

Because the App Store config (for me, at least) is only there to easily switch between provisioning profiles, my solution is to change the "Per-configuration Build Products Path" for the App Store config to $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME) so that the App Store config also builds into the Release build folder.


With the help of another SO questions(https://stackoverflow.com/a/10159481/143225) I was able to get the header file to include.

Apparently, the archive build process is somehow different than the debug build process. By adding "$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts" to the "User Header Search Paths" build setting it built successfully.

I'd still like to understand why this isn't working as I expect it. I have a hunch that the project is built to auto include the header files for debug and release builds, but somehow not for archive builds. This is odd because I thought archive builds inherit from either debug or release settings from Xcode's scheme settings.

Any additional info is welcome.


Daniel Tull's answer will work, but instead of changing the 'Per-configuration Build Products Path', you can update the static library project Configurations to include a 'App Store' configuration or any other named configuration which your app target is building against, which is a duplicate of the Release configuration. This way, the static library will output it's library and headers/include files to the appropriate directory, which will be resolved by the $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) macro used in the 'Per-configuration Build Products Path'; and walllaaaaa...the public library headers can now be resolved properly by Xcode. So to sum it up, if you have an 'App Store' named configuration in your app's target and your linking against a static library which exports headers, make sure the static library project also includes the 'App Store' configuration and you will be one happy camper.