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

蓝咒 提交于 2019-12-03 03:51:30

问题


I can build for debugging just fine. I've triple checked that the static library is included in the build phases settings for the project. I've also tried other things like header include paths and such to no avail.

When I try to build an IPA for test flight, I get an error: #import <MBProgressHUD/MBProgressHUD.h>

I've been able to build an IPA before, but it didn't implement/use the MBProgressHUD static library before.

I can include the the header and code file manually instead of statically linking it, but I prefer to know what's going on here.

Thanks.

PS - I used the "Static Library" instructions given https://github.com/jdg/MBProgressHUD


回答1:


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.




回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/13808853/why-is-a-static-librarys-header-file-not-found-for-archiving

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!