我们知道我们可以强制静态库在链接期间加载所有目标文件。这用于不同的目的,例如将目标 c 类别包含到静态库中等。
我的问题是,当项目使用 -ObjC 或 -all_load 标志时,是否可以强制库不加载所有目标文件?
我正在使用一些 clang 功能(特别是 __has_include 指令)来控制某些标头的导入,但是当使用 -ObjC 标志时,该指令无效,所有目标文件都已加载,因此我的库无法正常工作。
有没有办法解决或解决这个问题?
问候,
我们知道我们可以强制静态库在链接期间加载所有目标文件。这用于不同的目的,例如将目标 c 类别包含到静态库中等。
我的问题是,当项目使用 -ObjC 或 -all_load 标志时,是否可以强制库不加载所有目标文件?
我正在使用一些 clang 功能(特别是 __has_include 指令)来控制某些标头的导入,但是当使用 -ObjC 标志时,该指令无效,所有目标文件都已加载,因此我的库无法正常工作。
有没有办法解决或解决这个问题?
问候,
Is there any way to solve or workaround this problem?
是的,但它是一个脆弱且容易出错的点,可能不值得。将代码重构为不需要静态库的部分链接可能会更容易{y,ies}。
如果您对需要加载的每个符号都有一个硬引用,那么链接器将解析该符号并将其链接到最终的可执行文件中。
但是,由于这根本不是受支持或推荐的模式,因此可能无法直接引用代码中的某些符号。同样,似乎没有代表整个类别的符号。您可能必须单独引用一个类别中包含的任何方法。
见nm
命令行工具; nm -m library
将转储库中包含的所有符号信息。