• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ld - undefined reference

Object Storage Arubacloud
0 głosów
184 wizyt
pytanie zadane 20 września 2020 w C i C++ przez SimiVoid Pasjonat (19,790 p.)
edycja 20 września 2020 przez SimiVoid

Cześć,

Piszę taki prosty system operacyjny i mam nietypowy problem z includowaniem funkcji z biblioteki math.h w części z funkcji zawartych w pliku.

Błąd kompilatora

ld: kernel.cpp:(.text+0x97): undefined reference to `cos'
ld: kernel.cpp:(.text+0xa7): undefined reference to `round'
ld: kernel.cpp:(.text+0xb7): undefined reference to `sin'
ld: kernel.cpp:(.text+0xc7): undefined reference to `round'
make: 
	#assemble boot.s file
	as --32 src/boot.s -o boot.o

	#compile kernel.cpp file
	gcc -m32 -lm -c src/kernel.cpp -o kernel.o -std=c++17 -ffreestanding -O2 -Wall -Wextra

	#linking the kernel with kernel.o and boot.o files
	ld -m elf_i386 -T src/linker.ld kernel.o boot.o -o Simple-OS.bin

	#check MyOS.bin file is x86 multiboot file or not
	grub2-file --is-x86-multiboot Simple-OS.bin

	#building the iso file
	mkdir -p iso/boot/grub
	cp Simple-OS.bin iso/boot/Simple-OS.bin
	cp grub.cfg iso/boot/grub/grub.cfg
	grub2-mkrescue -o Simple-OS.iso iso
	rm -rf iso *.o Simple-OS.bin

run: 
	#run it in qemu
	qemu-system-x86_64 -cdrom Simple-OS.iso

Plik w którym mam problem:

#pragma once

#include <cmath>

#include "vga.h"
#include "system.h"

inline void drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color) {
    double_t dx = x2 - x1;
    double_t dy = y2 - y1;
    double_t derr = abs(dy / dx);
    double_t err = 0.0;
    uint16_t y = y1;

    if(dx == 0.0) {
        for(; y <= y2; y++)
            putPixel(x1, y, color);
        return;
    }

    for(uint16_t x = x1; x <= x2; x++) {
        putPixel(x, y, color);

        err += derr;

        if(err >= 0.5) {
            y += sgn(dy);
            err -= 1.0;
        }
    } 
}

inline void drawRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t color, bool filled = false) {
    drawLine(x, y, x + width - 1, y, color);
    drawLine(x, y, x, y + height - 1, color);
    drawLine(x, y + height - 1, x + width - 1, y + height - 1, color);
    drawLine(x + width - 1, y, x + width - 1, y + height - 1, color);

    if (filled) {
        for(uint16_t i = 1; i < height - 1; i++)
            drawLine(x, y + i, x + width - 1, y + i, color);
    }
}

inline void drawCircle(uint16_t x, uint16_t y, uint16_t radius, uint8_t color, bool filled = false) {
    for(double_t i = 0.0; i < 2 * M_PI; i+=0.02) {
        uint16_t xVal = x + std::round(cos(i) * radius); 
        uint16_t yVal = y + std::round(sin(i) * radius);

        if(filled) {
            drawLine(x, y, xVal, yVal, color);
        }
        else {
            putPixel(xVal, yVal, color);
        }
    }
}

Problem tkwi tylko w funkcji drawCircle()

Proszę o pomoc w rozwiązaniu tego problemu, ponieważ dołączenie flagi -lm do gcc nie pomaga.

Link do repozytorium: https://github.com/SimiVoid/Simple-OS

komentarz 20 września 2020 przez SimiVoid Pasjonat (19,790 p.)
używam cos i sin, a piszę na linuxie, a kompiluje od x86
komentarz 20 września 2020 przez tkz Nałogowiec (42,000 p.)
Flaga "-lm" powinno rozwiązać problem. Przynajmniej według LMP.
Miałem na myśli dlaczego używasz sincosl, skoro masz sin i cos.
komentarz 20 września 2020 przez tkz Nałogowiec (42,000 p.)

Spróbowałem sam i taki kod

#define _GNU_SOURCE 
#include <math.h>
#include <iostream>

int main()
{
    double sin;
    double cos;
    sincos(1, &sin, &cos);
    std::cout << sin << ' ' << cos;
}

z takimi flagami

g++ main.cc -lm -o a

daje taki wynik

0.841471 0.540302

Więc jeżeli nadal nie działa, to musisz źle linkować. 

komentarz 20 września 2020 przez tangarr Mędrzec (154,780 p.)
Czy jądro systemu może używać bibliotek dynamicznych?
Być może linkowanie statyczne załatwi sprawę.
komentarz 20 września 2020 przez SimiVoid Pasjonat (19,790 p.)

@tkz, dałem w treści link do repozytorium, może więcej z tego się wywnioskuje

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 26 grudnia 2020 w C i C++ przez Marcinnok Użytkownik (780 p.)
0 głosów
2 odpowiedzi 252 wizyt
pytanie zadane 7 stycznia 2023 w C i C++ przez mayak Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 419 wizyt
pytanie zadane 13 października 2022 w C i C++ przez Bilib Użytkownik (990 p.)

92,536 zapytań

141,376 odpowiedzi

319,449 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...