Erstellen

Funktionsbibliotheken in C zu Erstellen ist sehr einfach. Alle Funktionen, die über ein öffentliches Header-File definiert sind, gehören zur öffentlichen API der Funktionsbibliothek und können extern verwendet werden. Beispiel:

mylib.h

#ifndef HEADERGUARD_MYLIB_H
#define HEADERGUARD_MYLIB_H

int mylib_add(int a, int b);

#endif

mylib.c

#include "mylib.h"

int mylib_add(int a, int b)
{
    return a + b;
}

Die Programmierung unterscheidet sich nicht von der Programmierung ausführbarer Programme. Wichtigster Unterschied ist, dass es keine main()-Funktion gibt. Stattdessen entscheidet der Nutzer der Bibliothek wann er welche Funktion benötigt.

Im CMake wird das Bauen einer Funktionsbibliothek über add_library() definiert:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(demo C)
set(CMAKE_C_STANDARD 11)
add_library(mylib SHARED mylib.c)

Das SHARED gibt dabei an, dass ein Shard Object (.so) gebaut werden soll. Wird es weggelassen entsteht stattdessen ein Archive (.a).

Testen

Die Funktionsbibliothek lässt sich nun in Programme einbinden. Um das zu testen kann z.B. ein Testprogramm geschrieben werden:

main.c

#include <stdio.h>
#include "mylib.h"

int main() {
    int a = 5;
    int b = 3;

    int c = mylib_add(a, b);

    printf("c = %d\n", c);

    return 0;
}

Um die Testanwendung zu bauen und dem Kompiler die Verwendung unserer eigenen Bibliothek anzuweisen, müssen wir folgende Zeilen im CMakeLists.txt ergänzen:

add_executable(demo main.c)
target_link_libraries(demo PRIVATE mylib)

Prüft man das entstehende Testprogramm mit LDD zeigt sich, dass die Funktionsbibliothek tatsächlich verwendet wurde:

>$ ldd demo
        linux-vdso.so.1 (0x00007fff531bd000)
        libmylib.so => /dataPool/htwk/projects/dnsec/c-tutorium/06_APIs/03_ProvideAPis/cmake-build-debug/libmylib.so (0x00007f9c26428000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9c26037000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9c2682c000)

Last modified: Friday, 22 June 2018, 3:43 PM