kdevelop - Fehlermeldung "undefined reference"

Guten Abend,

ich versuche mich gerade an dem etwas älteren Buch “C und Linux” von Martin Gräfe (die 4. und letzte Auflage des Buches stammt von 2010) und hänge dabei schon ziemlich zu Beginn, als es erstmals um Kdevelop geht.

Meine Anwendung ist auf drei Dateien aufgeteilt und soll in der Konsole laufen:

main.cpp

#include <iostream>
#include <stdio.h>
#include "primzahl.h"

int main(int argc, char **argv) {
    int zahl;
    
    for (zahl=1; zahl<=100; zahl++)
        if (ist_primzahl(zahl))
            printf("%d
", zahl);
    return(0);
}


primzahl.h

int ist_primzahl(int zahl);

und primzahl.c

#include <math.h>

int ist_primzahl (int zahl)
{
    int teiler=2;

    while (teiler <= sqrt(zahl))
    {
        if (zahl % teiler ==0)
            return(0); /* 'zahl' ist keine Primzahl */
        teiler++;
    }
    return(1); /* 'zahl' ist eine Primzahl */
}


Beim Kompilieren von main.cpp hänge ich an der Fehlermeldung ***undefined reference to `ist_primzahl(int)’


Offenbar muss ich einen Linker -lm setzen, um die zwei anderen Dateien beim Kompilieren zu integrieren?

Mir ist jedoch nicht ganz klar, wo dies in Kdevelop zu geschehen hat? Die Version 4 oder 5 spielt dabei offenbar keine Rolle?

Vielen Dank für Eure Hilfe,
Felix

Update: mit Eclipse habe ich das Programm jetzt zum Laufen gebracht!

Trotzdem würde mich nach wie interessieren, wo ich in Kdevelop 5 den Linker Flag -lm unterbringen muss?

In CmakeLists.txt haben mich diese Einträge jedenfalls nicht weiter gebracht:

target_link_libraries(m)
add_executable(primzahlen2 main.cpp primzahl.h primzahl.c)

Gruß,
Fips

Da fehlt das “Target”, sollte wohl eher so ausschauen:

target_link_libraries(primzahlen2 m)

Sh. https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html

Allerdings ist dein Hauptproblem, dass du C++ mit C mischst. Die Funktion ist_primzahl(int) in primzahl.c wird nicht gefunden, das hat mit “-lm” nichts zu tun.
Ändere primzahl.h in:

extern "C" int ist_primzahl(int zahl);

oder (besser) benenne primzahl.c in primzahl.cpp um damits auch mit dem C++ Compiler kompiliert wird.

Dann sollts auch ohne dem target_link_libraries funktionieren.

Übrigens, wenn du mit cmake nicht klarkommst, kannst du auch “herkömmliche” Makefile’s verwenden.