gpt4 book ai didi

Xcode:如何归档带有使用 -bundle_loader 进行链接的嵌入式插件包的 Mac 应用程序?

转载 作者:行者123 更新时间:2023-12-03 16:19:45 28 4
gpt4 key购买 nike

我的设置:

Mac OS X 10.7.4
Xcode 4.3.2

我有一个 Mac OS X 应用程序,它加载嵌入式 Cocoa 可加载 bundle 以用作插件。这些插件包含在 Mac 应用程序的 .app 中捆绑在标准位置( MyApp.app/Contents/PlugIns )并通过标准 Cocoa NSBundle 加载API。在标准“复制文件”构建阶段,插件将被复制到最终的 Mac 应用程序包中,目标设置为 PlugIns 。我将其描述为 Mac 应用程序的标准 Cocoa 插件设置。

但是,有一件事有点不寻常。我正在使用 -bundle_loader在构建时将插件包链接到我的主应用程序中的公共(public)符号的选项。我最初是在 Xcode 3 中设置的,它一直运行良好。

Xcode 是这样描述的 -bundle_loader :

Bundle Loader
BUNDLE_LOADER
Specifies the executable that will be loading the bundle output file being linked. Undefined symbols from the bundle are checked against the specified executable like it was one of the dynamic libraries the bundle was linked with. [BUNDLE_LOADER, -bundle_loader]

在 Xcode 4 中,我仍然可以在调试发布构建配置中成功构建和运行我的 Mac 应用程序。没问题。 (我通过将默认运行操作的构建配置设置为“调试”或“发布”来实现此目的)。两种配置都可以正常构建和运行。

这是我的问题:在 Xcode 4 中,我无法成功存档我的 Mac 应用程序。插件包不会在链接时(在构建过程中编译后立即)链接到主应用程序可执行文件。

我的存档操作设置为使用发布构建配置(当然)进行构建。正如我所提到的,使用运行操作的发布构建配置进行构建没有问题。仅在执行存档操作时才会出现此问题。

这是我在尝试存档时收到的链接错误(在编译第一个插件包的源代码后立即发生这种情况):

Ld /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/InstallationBuildProductsLocation/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/Fake.app/Contents/PlugIns/Tabs.fluidplugin/Contents/MacOS/Tabs normal x86_64
cd /Volumes/SystemY/Users/<myusername>/work/fluidium/trunk/Fluidium
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -bundle -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk -L/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release -F/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release -filelist /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/IntermediateBuildFilesPath/Fluidium.build/Release/TabsPlugIn.build/Objects-normal/x86_64/Tabs.LinkFileList -mmacosx-version-min=10.6 -bundle_loader /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/FluidApp.app/Contents/MacOS/FluidApp /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/TDAppKit.framework/TDAppKit -framework Quartz -framework WebKit -framework Cocoa -o /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/InstallationBuildProductsLocation/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/Fake.app/Contents/PlugIns/Tabs.fluidplugin/Contents/MacOS/Tabs

Undefined symbols for architecture x86_64:
"_OBJC_IVAR_$_FUPlugIn.aboutInfoDictionary", referenced from:
-[FUTabsPlugIn aboutInfoDictionary] in FUTabsPlugIn.o
"_OBJC_CLASS_$_FUPlugIn", referenced from:
_OBJC_CLASS_$_FUTabsPlugIn in FUTabsPlugIn.o
"_OBJC_METACLASS_$_FUPlugIn", referenced from:
_OBJC_METACLASS_$_FUTabsPlugIn in FUTabsPlugIn.o
"_FUTabControllerProgressDidStartNotification", referenced from:
-[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
-[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
"_FUTabControllerProgressDidChangeNotification", referenced from:
-[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
-[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
"_FUTabControllerProgressDidFinishNotification", referenced from:
-[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
-[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

最后一点:我在充当“捆绑加载程序”的 Mac 应用程序目标上设置了以下build设置:

在复制过程中删除调试符号:否(对于调试和发布)
默认隐藏符号:NO(对于调试和发布)

最佳答案

解决了!

构建发布时,我的主应用程序目标上没有执行“Strip”阶段。但是,在存档时,在我的主应用程序目标上执行了“Strip”阶段。 (不知道为什么这是不同的,因为两者都是通过发布构建配置构建的,但确实)。

存档时的剥离阶段是插件无法通过bundle_loader链接的原因:符号已从主应用程序的二进制文件中剥离。

解决方案是在我的主应用程序(用作捆绑加载器的应用程序)的build设置中设置以下设置:

strip 样式:调试符号

关于Xcode:如何归档带有使用 -bundle_loader 进行链接的嵌入式插件包的 Mac 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10565439/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com