motata2motata Ответов: 2

Проблема с классом, экспортированным из библиотеки статических ссылок


Я подготовил очень простой проект библиотеки статических ссылок (projectlib. lib), включающий только lib. h и lib.cpp,я хочу экспортировать класс с именем c_lib1,есть 2 способа, которые я пробовал:
(1) объявите класс c_lib1 в lib. h и определите c_lib1 в lib.cpp.
(2) непосредственно определите класс c_lib1 в lib. h:
class c_lib1
{
   public:
     int m_a, m_b;
     int m_add(int a, int b)
          {
             return a + b;
          };
};

Затем сгенерируйте projectlib.lib. Далее в прикладном проекте (. exe) я использую эту статическую библиотеку projectlib. lib,в прикладном проекте использую вышеописанный (1) метод, не могу идентифицировать класс c_lib1, но использование (2) метода может компилироваться через него, вот почему?

Что я уже пробовал:

Я пробовал оба этих способа

2 Ответов

Рейтинг:
8

nv3

При использовании метода (1), который является обычным способом для статической библиотеки, вы должны включить файл lib.h в код, использующий вашу библиотеку. И вы должны сказать компоновщику, чтобы он включил файл lib. obj (см. настройки вашего проекта на вкладке компоновщик или соответствующие аргументы командной строки компоновщика).

Используя метод (2), компилятор может встроить весь код вашего m_app метод и, следовательно, вызывающий код не нуждаются в файле lib.obj для разрешения этой ссылки. Вот почему ваш пример работает, хотя вы, вероятно, не указали lib.obj для компоновщика.

Но: в зависимости от размера функции компилятор не обязательно будет встроен в функцию, и тогда файл .obj будет необходим во время ссылки.


Рейтинг:
0

Kornfeld Eliyahu Peter

Не совсем ясно, но это я могу сказать...
Все объявления должны быть в заголовочном файле (.h), в то время как фактическое тело может быть также в заголовочном файле (.h) или исходном файле (.cpp)...
Здесь есть хорошее пошаговое руководство от Microsoft: Пошаговое руководство: создание и использование статической библиотеки (C++)[^]