Eine Drop-In-Bibliothek mit zwei Dateien zum Auffinden der aktuellen ausführbaren Datei und des aktuellen Moduls im Dateisystem.
Unterstützte Plattformen:
Windows
Linux
Mac
iOS
Android
QNX-Neutrino
FreeBSD
NetBSD
DragonFly BSD
SunOS
OpenBSD
Fügen Sie einfach whereami.h
und whereami.c
in Ihren Build ein und legen Sie los. (siehe auch Customizing-Kompilierung)
wai_getExecutablePath()
gibt den Pfad der umschließenden ausführbaren Datei zurück
wai_getModulePath()
gibt den Pfad des umschließenden Moduls zurück
Beispielverwendung:
erster Aufruf int length = wai_getExecutablePath(NULL, 0, NULL);
um die Länge des Pfades abzurufen
Ordnen Sie den Zielpuffer zu mit path = (char*)malloc(length + 1);
Rufen Sie wai_getExecutablePath(path, length, &dirname_length)
erneut auf, um den Pfad abzurufen
füge ein Terminal- NUL
-Zeichen mit path[length] = '�';
Hier ist die Ausgabe des Beispiels:
$ make -j -C _gnu-make $ cp ./bin/mac-x86_64/library.dylib /tmp/ $ ./bin/mac-x86_64/executable --load-library=/tmp/library.dylib executable path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable module path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable library loaded executable path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable module path: /private/tmp/library.dylib dirname: /private/tmp basename: library.dylib library unloaded
Sie können das Verhalten der Bibliothek anpassen, indem Sie die folgenden Makros definieren:
WAI_FUNCSPEC
WAI_PREFIX
WAI_MALLOC
WAI_REALLOC
WAI_FREE
Im Ordner _win-vs14/
befindet sich eine Visual Studio 2015-Lösung.
Es gibt ein GNU Make 3.81 MakeFile
im Ordner _gnu-make/
:
$ make -j -C _gnu-make/
Siehe oben, wenn Sie über die Befehlszeile kompilieren möchten. Andernfalls befindet sich ein Xcode-Projekt im Ordner _mac-xcode/
.
Im Ordner _ios-xcode/
befindet sich ein Xcode-Projekt.
Wenn Sie lieber über die Befehlszeile kompilieren und über SSH auf einem Gerät mit Jailbreak bereitstellen möchten, verwenden Sie Folgendes:
$ make -j -C _gnu-make/ binsubdir=ios CC="$(xcrun --sdk iphoneos --find clang) -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch armv7 -arch armv7s -arch arm64" postbuild="codesign -s 'iPhone Developer'"
Sie müssen das Android NDK installieren und die Umgebungsvariable $NDK_ROOT
auf den NDK-Pfad verweisen: z. B. export NDK_ROOT=/opt/android-ndk
(ohne ein nachgestelltes /
-Zeichen).
Als Nächstes besteht die einfache Möglichkeit darin, mit dem folgenden Befehl eine eigenständige Android-Toolchain zu erstellen:
$ $NDK_ROOT/build/tools/make_standalone_toolchain.py --arch=arm64 --api 21 --install-dir=/tmp/android-toolchain
Jetzt können Sie das Beispiel kompilieren, indem Sie Folgendes ausführen:
$ make -j -C _gnu-make/ platform=android architecture=arm64 CC=/tmp/android-toolchain/bin/aarch64-linux-android-gcc CXX=/tmp/android-toolchain/bin/aarch64-linux-android-g++
Das Laden einer seitenorientierten Bibliothek direkt aus APKs wird unterstützt. Verwenden Sie zum Testen Folgendes:
$ zip -Z store app bin/android/library.so $ zipalign -v -f -p 4 ./app.zip ./app.apk
Kopieren Sie dann bin/android/executable
und app.apk
auf Ihr Android-Gerät und starten Sie dort:
$ ./executable --load-library=$PWD/app.apk!/bin/android/library.so