Классы в статических библиотеках.
--------------------------------------------------------
Для примера (только ПРИМЕРНО, как я пытаюсь это сделать):
В стат. библиотеке:
//.hpp
class test
{
public:
int test_mthd();
};
//.cpp
#iclude "tetslib.hpp"
int test:: test_mthd() { return 2; }
дальше получаю - testlib.lib
------------------------------------------------------------
В самой программе:
#pragma comment(lib, "testlib.lib")
#include "testlib.hpp"
test t;
int main()
{
t.some_mthd();
return 0;
}
------------------------------------------------------------
И в итоге облом - прогармма не видит методов класса:
unresolved external symbol "public: int __thiscall test::some_mthd()" (?some_mthd@test@@QAEPAEI@Z)
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
---------------------------------------------------------
Пачему?
2. И почему в классе метод называеться test_mthd(), а в программе some_mthd(). Он точно реализован? )
не как методы класса, а как отдельные функции вызваются нормально.
2. Это я просто опечатку сделал - когда пост печптал, в исходнике всё нормально.
--------------------------------
Проблема в том, что программа думает, что класс в заголовочном файле
testlib.hpp - объявлен как новый класс, и не видит его реализации
внутри lib-файла (даже не пытается видеть).
------------------------------------
вот для функции мне приходится указывать класс памяти в .hpp программы - extern, чтоб линковщик ошибок не выдовал.
Т.е. вот так:
//в библиотеке:
//.hpp
int test_func();
//.cpp
#include "testlib.hpp"
int test_func() { return 2; }
//в программе:
//testlib.hpp:
extern int test_func();
//.cpp
#pragama comment(lib, "testlib.lib")
#include "testlib.hpp"
int main()
{
test_func();
return 0;
}
//Вот так всё чётко пашет...
---
Может и классы надо как-нибудь по особому обявлять???
------------------------------------------------------
У кого нибудь есть рабочий пример??
Проблема в том, что программа думает, что класс в заголовочном файле
testlib.hpp - объявлен как новый класс, и не видит его реализации
внутри lib-файла (даже не пытается видеть).
[/QUOTE]
Это ошибочное предположение.
Что значит "новый класс"?
Есть такое понятие "единица компиляции". Грубо говоря это один с/cpp файл со всеми подключенными к нему заголовочными файлами (.h).
Так вот эти единицы компиляции никак друг с другом не связаны. Соединяет их линковщик, а ему все равно где какой это obj-файл, только что созданный из cpp или взятый из lib. Так что не имеет значения где находится реализация класса.
[QUOTE=bave]
вот для функции мне приходится указывать класс памяти в .hpp программы - extern, чтоб линковщик ошибок не выдовал.
Т.е. вот так:
//в библиотеке:
//.hpp
int test_func();
//.cpp
#include "testlib.hpp"
int test_func() { return 2; }
//в программе:
//testlib.hpp:
extern int test_func();
//.cpp
#pragama comment(lib, "testlib.lib")
#include "testlib.hpp"
int main()
{
test_func();
return 0;
}
//Вот так всё чётко пашет...
[/QUOTE]
В данном случае extern - совершенно лишнее.
[QUOTE=bave]
Может и классы надо как-нибудь по особому обявлять???
[/QUOTE]
Нет
[QUOTE=bave]
У кого нибудь есть рабочий пример??[/QUOTE]
Твой первый пример (если исправить опечатку с именами методов) вполне рабочий (проверенно)
Ищи ошибку в чем-то другом. Может, не находиться твоя lib...