ООП в статической библиотеке

Рейтинг: 0Ответов: 1Опубликовано: 04.03.2023

Я не так давно узнал про статические/динамические библиотеки и у меня появился вопрос: Как сделать класс в статической библиотеке?? Я написал следующее для библиотеки:

extern "C"
{
    struct Sum
    {
        int sum(int a, int b)
        {
            return a + b;
        }
    };
}

И это для использования:

#include <iostream>

extern "C"
{
    struct Sum
    {
        int sum(int, int);
    };
}

int main()
{
    Sum sum;
    std::cout << sum.sum(1, 1) << std::endl;
    return 1;
}

Но это не работает, ошибка линкера: LNK2001: неразрешенный внешний символ "public: int __cdecl Sum::sum(int,int)" (?sum@Sum@@QEAAHHH@Z)

Как можно сделать нормальное ооп в статической библиотеке?

Ответы

▲ 4Принят

Судя по ошибке LNK, вы используете Visual C++.

Вот ваш пример, переделанный в создание и использование статической библиотеки.

sum.h Заголовочный файл для библиотеки

#pragma once
struct Sum {
    int sum(int a, int b);
    };

sum.cpp Файл реализации

#include "Sum.h"
int Sum::sum(int a, int b) { return a + b; }

main.cpp Файл, использующий библиотеку

#include <iostream>
#include "Sum.h"
int main() {
    Sum sum;
    std::cout << sum.sum(1, 1) << std::endl;
    }

Компиляция библиотечного файла в объектный:

cl -c sum.cpp

Сборка его в библиотеку sumlib:

lib /out:sumlib.lib Sum.obj 

Компиляция главного файла с использованием библиотеки:

cl -EHsc main.cpp sumlib.lib 

Все - библиотека создана и использована.