使用 ios_framework 规则创建动态框架后,一些导出的符号会消失
Some exported symbols disappear after creating a dynamic framework with the ios_framework rule
我在尝试使用 Bazel 构建混合语言动态 iOS 框架时遇到了一个很奇怪的情况。
框架源码由*.c、*.cpp、*.m、*.mm、*.h、*.hpp文件组成。
我的第一个幼稚尝试是声明一个引用所有来源的单一 objc_library 规则。那失败了,一条错误消息读取了有关冲突规则的内容。然后我分别为 *.m、*.mm、*.c 和 *.cpp 文件声明了四个不同的 objc_library
规则,然后引用所有这四个规则作为最终 ios_framework
规则的依赖项。
至此,一切都编译和链接正常(除了一些预期的编译器警告)。然而,黑魔法开始了:
- 编译 ObjectiveC++ 源代码得到的静态库确实包含所有必要的符号(使用"nm"工具验证)
- 链接阶段生成的 .apple_binary_lipobin 文件 不 包含来自 ObjectiveC++ 源的符号
我相信我仔细检查了用于编译和链接的命令行,包括 Bazel 和 xcodebuild。
我能发现的唯一异常情况:
- xcodebuild 在链接时传递了一个
-single_module
参数,而 Bazel cross tool 则没有。
Bazel 交叉工具在链接期间调用 wrapped_clang_pp
时添加 '-stdlib=libc++' '-std=gnu++11'
命令行参数,而 xcodebuild 不传递这些参数。我猜 Bazel 这样做是因为默认的 Apple CROSSTOOL 中有这些行:
action_config {
config_name: "objc++-executable"
action_name: "objc++-executable"
tool {
tool_path: "wrapped_clang_pp"
execution_requirement: "requires-darwin"
}
flag_set {
flag_group {
flag: "-stdlib=libc++"
flag: "-std=gnu++11"
}
但我不确定在调用链接器时是否真的需要这些标志。
我必须承认我 运行 除了尝试修补 CROSSTOOl 文件以使其行为尽可能接近 xcodebuild 之外,我没有其他想法。
请帮忙
您可以尝试将 alwayslink = 1
添加到包含 C++ 符号的 objc_library
目标吗?链接器正在删除 C++ 符号,因为它们没有在二进制文件中的任何地方被引用。
我在尝试使用 Bazel 构建混合语言动态 iOS 框架时遇到了一个很奇怪的情况。
框架源码由*.c、*.cpp、*.m、*.mm、*.h、*.hpp文件组成。
我的第一个幼稚尝试是声明一个引用所有来源的单一 objc_library 规则。那失败了,一条错误消息读取了有关冲突规则的内容。然后我分别为 *.m、*.mm、*.c 和 *.cpp 文件声明了四个不同的 objc_library
规则,然后引用所有这四个规则作为最终 ios_framework
规则的依赖项。
至此,一切都编译和链接正常(除了一些预期的编译器警告)。然而,黑魔法开始了:
- 编译 ObjectiveC++ 源代码得到的静态库确实包含所有必要的符号(使用"nm"工具验证)
- 链接阶段生成的 .apple_binary_lipobin 文件 不 包含来自 ObjectiveC++ 源的符号
我相信我仔细检查了用于编译和链接的命令行,包括 Bazel 和 xcodebuild。
我能发现的唯一异常情况:
- xcodebuild 在链接时传递了一个
-single_module
参数,而 Bazel cross tool 则没有。 Bazel 交叉工具在链接期间调用
wrapped_clang_pp
时添加'-stdlib=libc++' '-std=gnu++11'
命令行参数,而 xcodebuild 不传递这些参数。我猜 Bazel 这样做是因为默认的 Apple CROSSTOOL 中有这些行:action_config { config_name: "objc++-executable" action_name: "objc++-executable" tool { tool_path: "wrapped_clang_pp" execution_requirement: "requires-darwin" } flag_set { flag_group { flag: "-stdlib=libc++" flag: "-std=gnu++11" }
但我不确定在调用链接器时是否真的需要这些标志。
我必须承认我 运行 除了尝试修补 CROSSTOOl 文件以使其行为尽可能接近 xcodebuild 之外,我没有其他想法。
请帮忙
您可以尝试将 alwayslink = 1
添加到包含 C++ 符号的 objc_library
目标吗?链接器正在删除 C++ 符号,因为它们没有在二进制文件中的任何地方被引用。