Wie verlinke ich mit CMake auf die C-Mathematikbibliothek?

Lesezeit: 3 Minuten

Benutzeravatar von phillipsK
PhillipsK

Wie füge ich die hinzu math Bibliothek in meine CMake-Datei? Dieser Beitrag verweist auf das Hinzufügen von a Target-Link-Bibliothekaber ich bin nicht allzu vertraut mit C. Ein zusätzlicher Beitrag – Könnte jemand bitte ein Beispiel demonstrieren. Dokumentation Ich verwende C und erhalte eine undefined reference to 'pow' mit der pow-Methode des Math-Headers.

cmake_minimum_required(VERSION 3.3)
project(CSCI-E-28-Unix-Linux-Systems-Programming)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    CMakeLists.txt
    getchar.c
    main.cpp
        hw0
    more01.c)

#target_link_libraries(<math.h> m)

add_executable(main main.cpp)
add_executable(getchar getchar.c)
add_executable(more01 more01.c)
add_executable(argu print_all_arguments.c)
add_executable(chars chars.c)
add_executable(ch4 ch4.c)

  • Warum setzen Sie CXX-Flags? Diese sind für C++, nicht C. Und Sie haben die Sprache für Ihr Projekt nicht definiert, sollte es sein enable_language(C).

    – usr1234567

    6. Januar 2016 um 8:12 Uhr

Benutzeravatar von usr1234567
usr1234567

Viele mathematische Funktionen (pow, sqrt, fabs, log etc.) sind in deklariert math.h und benötigen die Bibliothek libm verbunden werden. nicht wie libcdie automatisch verknüpft wird, libm ist eine separate Bibliothek und erfordert häufig eine explizite Verknüpfung. Der Linker setzt zunächst alle Bibliotheken voraus libalso zum verlinken libm Sie verlinken m.

Sie müssen es wie verwenden target_link_libraries(ch4 m) verlinken libmzu deinem Ziel. Das erste Argument muss ein Ziel sein. Daher muss es nach verwendet werden add_executable(ch4 ch4.c) wie:

add_executable(ch4 ch4.c)
target_link_libraries(ch4 m)

  • Es ist überraschend, dass dies für Cygwin unter Windows nicht erforderlich ist. Aber leider wird auf *nix benötigt.

    – John Strood

    26. Juli 2016 um 18:23 Uhr

  • Können Sie die vollständige richtige Antwort aufschreiben? Ist m ein Platzhalter? oder ist das nur allgemein bekannt math.c ist in einer Bibliothek namens m? Oder ist es auf eine Weise deklariert, die ich im obigen Skript nicht verstehe?

    – Schlitten

    17. Januar 2019 um 19:30 Uhr

  • Super, jetzt verstehe ich es. Ich habe eine Frage verlinkt, die ich zuvor gestellt hatte, wie “libm” nur “m” wird, nur der Vollständigkeit halber.

    – Schlitten

    18. Januar 2019 um 15:18 Uhr

  • Bei MSVC führt dies zu folgendem Build-Fehler: [CMake] LINK : fatal error LNK1104: cannot open file 'm.lib'

    – Wouter Beek

    6. Juli 2019 um 11:14 Uhr

  • Ich versuche zu bauen GLFW von der Quelle und es gibt keine Linie add_executable in CMakeLists.txt. Was soll ich machen?

    – Benutzer2513149

    14. Juli 2019 um 14:31 Uhr

Für verschiedene Ziele ist es eine gute Idee zu testen, ob das Hinzufügen einer Bibliothek erforderlich ist oder nicht, und wenn ja, wo sie sich befindet oder wie sie benannt ist. Hier ist eine Möglichkeit, dies zu tun:

:
include(CheckLibraryExists)

CHECK_LIBRARY_EXISTS(m sin "" HAVE_LIB_M)                                                                                                
                                                                                                                                         
if (HAVE_LIB_M)                                                                                                                          
    set(EXTRA_LIBS ${EXTRA_LIBS} m)                                                                                                      
endif (HAVE_LIB_M)

:
//More tests & build-up of ${EXTRA_LIBS}
:

add_executable(ch4 ch4.c)
target_link_libraries(ch4 PUBLIC ${EXTRA_LIBS})

Für Ziele wo libm ist ein Teil von libcsollte der obige Test fehlschlagen, dh ${EXTRA_LIBS} werde es vermissen u target_link wird nicht versuchen, hinzuzufügen.

1400740cookie-checkWie verlinke ich mit CMake auf die C-Mathematikbibliothek?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy