Objective-Cランタイムのインスタンス化を回避することはできませんが、明らかにそれらの1つをすでに持っています。
Cからランタイムを操作する場合は、 Objective-CランタイムプログラミングガイドおよびObjective-Cランタイムリファレンスに記載されているように、Objective-CランタイムAPIを使用できます。
アイデアは次のようなものです(テストされていません):
#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
id pool = class_createInstance(NSAutoreleasePoolClass, 0);
return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
(void)objc_msgSend(pool, "drain");
}
これらの関数を別のファイルから呼び出したい場合は、もちろん、そこにもobjc/runtime.hを含める必要があります。または、allocAndInit関数からの戻りでidをvoid *にキャストし、void*を取得してdrain関数でidにキャストバックすることもできます。(structobjc_objectとtypedefstruct objc_object * idを前方宣言することもできますが、実際には正しい定義であるとは限りません。)
linkコマンドで-lobjcを渡す必要はありません。
言うまでもなく、ビルドスクリプトで.mファイルを処理するだけの作業はおそらく少なくなります。