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.o

    Hat jemand eine Idee wo da die Verknüpfung fehlt?


Log in to reply