Shared Object richtig linken
-
Guten Abend zusammen,
da es keine explizites Linker Kategorie gibt poste ich es jetzt einfach mal hier rein.Ich bin gerade dabei ein Shared Object zu schreiben, welches nachher in Python eingebunden werden soll.
Zum testen habe ich ein ganz einfaches Beispiel geschrieben:#include <stdio.h> #include <stdlib.h> #include <string.h> #include "utils.h" void schreibe(void) { char *pDumpText = "Hello World\n"; char *pDumpText2 = "Hello World\n1+1=___2\n"; HexDump(pDumpText, strlen(pDumpText)); HexDump(pDumpText2, strlen(pDumpText2)); }
Hex Dump ist in diesem Fall ein Funktion aus einer Utility Library die ich geschrieben habe.
Hier einmal das Makefile, wie ich das Shared Object übersetzte:
utilslib := -I./libs/Utils -L./libs/Utils -lutils map = -Wl,-Map -Wl,cutils.map all: gcc -c -fPIC -I./libs/Utils cutils.c -o cutils.o gcc $(utilslib) cutils.o -shared -o cutils.so
Übersetzten macht er auch ohne sich zu beschweren.
Wenn ich nun aber die Funktion "schreibe()" in Python ausführe:from ctypes import * a = cdll.LoadLibrary("./cutils.so") a.schreibe()
Bekomme ich den Fehler:
OSError: ./cutils.so: undefined symbol: HexDump
Wenn ich mir allerdings ein Map File erzeugen lasse sehe ich folgendes:
Linker script and memory map
LOAD /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o
LOAD /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginS.o
LOAD ./libs/Utils/libutils.a
LOAD cutils.oHat jemand eine Idee wo da die Verknüpfung fehlt?