Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 17.04.13 09:22
Оценка: -1
Здарвствуйте! Создал два проекта в VS2008 (x32 в Win7):
— геlib.LIB -- там функция, которая должна вызваться из EXE
— CalLIB.EXE -- тут вызов функции из LIB
Но EXE-проект не собирается.

В свойства проекта добавил нужные ссылки
— С/С++-Доп.каталоги включения=..\..\utlib\utlib
— Компоновщик-Доп.каталоги библиотек=..\..\utlib\Debug
— Ввод-Доп.зависимости=..\..\utlib\Debug\utlib.lib

Вызов записан так:
#include "utlib.h"
#pragma comment(lib, "utlib.lib")
 
void CCallLIBDlg::OnBnClickedButton1()
{
    utlib::hash(CString &StrVar);
}

Получаю ошибку
http://files.rsdn.ru/95990/ERR_LNK2019.png
Может кто посмотрит преокт — ничего не получается.
http://files.rsdn.ru/95990/prj.zip
Re: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 17.04.13 09:33
Оценка:
Здравствуйте, bURov, Вы писали:

UR>Вызов записан так:

UR>
#include "utlib.h"
UR>#pragma comment(lib, "utlib.lib")
 
UR>void CCallLIBDlg::OnBnClickedButton1()
UR>{
UR>    utlib::hash(CString &StrVar);
UR>}

UR>Получаю ошибку
UR>http://files.rsdn.ru/95990/ERR_LNK2019.png
UR>Может кто посмотрит преокт — ничего не получается.
UR>http://files.rsdn.ru/95990/prj.zip

А в либе utlib::hash(CString &StrVar); вообще есть?
https://github.com/BlackEric001
Re: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 17.04.13 09:40
Оценка:
Сорри, ошибся. Так сейчас:
#include "utlib.h"
#pragma comment(lib, "utlib.lib")

void CCallLIBDlg::OnBnClickedButton1()
{
    utlib::hash(m_sUNum);
}
Это от старого кода я привел. Теперь уже формальный и фактический аргументы с разными именами.
Re: Не могу вызвать функцию из LIB-библиотеки
От: blonduser  
Дата: 17.04.13 13:34
Оценка: -1
Здравствуйте, bURov, Вы писали:

UR>Здарвствуйте! Создал два проекта в VS2008 (x32 в Win7):

UR>- геlib.LIB -- там функция, которая должна вызваться из EXE
UR>- CalLIB.EXE -- тут вызов функции из LIB
UR>Но EXE-проект не собирается.

UR>В свойства проекта добавил нужные ссылки

UR>- С/С++-Доп.каталоги включения=..\..\utlib\utlib
UR>- Компоновщик-Доп.каталоги библиотек=..\..\utlib\Debug
UR>- Ввод-Доп.зависимости=..\..\utlib\Debug\utlib.lib

UR>Вызов записан так:

UR>
#include "utlib.h"
UR>#pragma comment(lib, "utlib.lib")
 
UR>void CCallLIBDlg::OnBnClickedButton1()
UR>{
UR>    utlib::hash(CString &StrVar);
UR>}

UR>Получаю ошибку
UR>http://files.rsdn.ru/95990/ERR_LNK2019.png
UR>Может кто посмотрит преокт — ничего не получается.
UR>http://files.rsdn.ru/95990/prj.zip

В библиотеки должно быть описано, что класс экспортируется.
В программе — импортируется.
Re[2]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 06:53
Оценка:
B>В библиотеки должно быть описано, что класс экспортируется.
B>В программе — импортируется.
__declspec(dllexport) int hash();
__declspec(dllimport) int hash();
Так?
А это в cpp-файле или в h-файле?
В каком месте в тексте?
Re[2]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 07:32
Оценка:
B>В библиотеки должно быть описано, что класс экспортируется.
B>В программе — импортируется.
Значит для LIB-варианта недостаточно только создать LIB-файл в LIB-проекте студии.
Может быть нужно ещё дополнительно подготовить утилитой-библиотекарем LIB?
Re[3]: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 18.04.13 08:30
Оценка:
Здравствуйте, bURov, Вы писали:

B>>В библиотеки должно быть описано, что класс экспортируется.

B>>В программе — импортируется.
UR>Значит для LIB-варианта недостаточно только создать LIB-файл в LIB-проекте студии.
UR>Может быть нужно ещё дополнительно подготовить утилитой-библиотекарем LIB?

Либу же тоже сам делал?
Тогда сделай для простоты либу с одной функцией сложения и разбирайся как оно должно быть.
Потом когда поймешь — заводи эту.
Быстрее будет.
https://github.com/BlackEric001
Re[4]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 08:34
Оценка:
BE>Либу же тоже сам делал?
BE>Тогда сделай для простоты либу с одной функцией сложения и разбирайся как оно должно быть.
BE>Потом когда поймешь — заводи эту.
BE>Быстрее будет.
Да, сам. И там и есть функция "hash", которая пока ничего не делает (катсти, я проектик для студии прицепил). Эта единственная функция в классе "utlib", разве что ещё конструктос деструктором, что по-умолчанию с клссом создались.
И я вот и разбираюсь, чтобы просто все собралось без ошибок и вызов функции получился.
Re[5]: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 18.04.13 12:13
Оценка:
Здравствуйте, bURov, Вы писали:

В интернете же полно примеров.
Вот простейший: How to Create and Implement Static Library in VC++

Т.е. создаем проект статической либы и добавляем 2 файла. В хедере пишем


// Returns a + b
double Add(double a, double b);



В cpp реализуем эту функцию.
Собрали lib файл. Все.

Дальше создали консольное приложение. Ему в ресурсы подключили собранную либу и подкинули хедер из проекта либы
В cpp написали


// TestUseL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "TestL.h"


int _tmain(int argc, _TCHAR* argv[])
{
    double c = Add(5, 7);

    printf("c = %f\n", c);

    getchar();

    return 0;
}


Все. Если нужно с классами — пример в msdn Creating and Using a Static Library (C++)
https://github.com/BlackEric001
Re[6]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 12:22
Оценка:
BE>В интернете же полно примеров.
BE>Вот простейший: How to Create and Implement Static Library in VC++
BE>Дальше создали консольное приложение.
Ну мне же не консольное EXE нужно.
Мне с диалогами, контролами. Я его и пытаюсь собрать.
По интеренту я полазил достаточно.
И там, да, упирают все примеры в консольное EXE.
Сейчас по форумам ищу. Все вроде предлагают то, что я уже и сам выполнил.
А сборка не идет ((
Re[7]: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 18.04.13 12:27
Оценка:
Здравствуйте, bURov, Вы писали:

UR>Мне с диалогами, контролами. Я его и пытаюсь собрать.

UR>По интеренту я полазил достаточно.
UR>И там, да, упирают все примеры в консольное EXE.
UR>Сейчас по форумам ищу. Все вроде предлагают то, что я уже и сам выполнил.
UR>А сборка не идет ((

А вы уверены, что пихать диалоги и контролы в либу это хороший вариант?
https://github.com/BlackEric001
Re[2]: Не могу вызвать функцию из LIB-библиотеки
От: pik Италия  
Дата: 18.04.13 12:37
Оценка:
Здравствуйте, blonduser, Вы писали:

B>В библиотеки должно быть описано, что класс экспортируется.

B>В программе — импортируется.

не путайте вы его он сам запутается

если скомпилировано как lib то не надо, надо толъко если lib получена из dll
Re: Не могу вызвать функцию из LIB-библиотеки
От: pik Италия  
Дата: 18.04.13 12:45
Оценка:
Здравствуйте, bURov, Вы писали:


UR>Получаю ошибку

UR>http://files.rsdn.ru/95990/ERR_LNK2019.png

_cdecl в LIBе убери
Re[8]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 12:56
Оценка:
BE>А вы уверены, что пихать диалоги и контролы в либу это хороший вариант?
В принципе, почему бы и нет, НО.
Я не в либу их пихаю, а в EXE.
А либу строю не как виндовс-приложение или консольное, а как статичесое.
Re[2]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 13:18
Оценка:
UR>>Получаю ошибку
UR>>http://files.rsdn.ru/95990/ERR_LNK2019.png
pik>_cdecl в LIBе убери
Я _cdecl не задаю -- это в ошибке студия пишет.

//utlib.h
#include <atlstr.h>

#pragma once

class utlib
{
public:
    utlib(void);
    ~utlib(void);
    CString StrVar;
    static int hash(CString &StrVar);

};

//utlib.cpp
#include "utlib.h"

utlib::utlib(void)
: StrVar(_T(""))
{
}

utlib::~utlib(void)
{
}

int utlib::hash(CString &StrVar)
{
    return 0;
}
Re[3]: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 18.04.13 13:21
Оценка:
Здравствуйте, bURov, Вы писали:

UR>>>Получаю ошибку

UR>>>http://files.rsdn.ru/95990/ERR_LNK2019.png
pik>>_cdecl в LIBе убери
UR>Я _cdecl не задаю -- это в ошибке студия пишет.

UR>
//utlib.h
UR>#include <atlstr.h>

UR>#pragma once

UR>class utlib
UR>{
UR>public:
UR>    utlib(void);
UR>    ~utlib(void);
UR>    CString StrVar;
UR>    static int hash(CString &StrVar);

UR>};
UR>


static попробуй убрать.
https://github.com/BlackEric001
Re[4]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 18.04.13 13:26
Оценка:
__cdecl (/Gd) -- это один из трех ключей компилятора для EXE-файла (+ fastcall, stdcall)
BE>static попробуй убрать.
Завтра попробую.
Re[5]: Не могу вызвать функцию из LIB-библиотеки
От: BlackEric http://black-eric.lj.ru
Дата: 18.04.13 13:31
Оценка: +1
Здравствуйте, bURov, Вы писали:

UR>__cdecl (/Gd) -- это один из трех ключей компилятора для EXE-файла (+ fastcall, stdcall)

BE>>static попробуй убрать.
UR>Завтра попробую.

Добейся работы
int hash()
{
  return 0;
}


а потом постепенно навешивай навороты. Тогда и поймешь в чем проблема.
https://github.com/BlackEric001
Re: Не могу вызвать функцию из LIB-библиотеки
От: carpenter Голландия  
Дата: 18.04.13 14:37
Оценка:
Здравствуйте, bURov, Вы писали:

а у тебя оба проекта используют unicode character set?
а то по ходу екзешник пользует multibyte a либа unicode
Весь мир — Кремль, а люди в нем — агенты
Re[2]: Не могу вызвать функцию из LIB-библиотеки
От: bURov  
Дата: 19.04.13 06:53
Оценка:
C>а у тебя оба проекта используют unicode character set?
C>а то по ходу екзешник пользует multibyte a либа unicode
Точно, недосмотрел! Я зачем-то отключил в EXE unicode.
Сейчас опробовал оба проекта и в unicode и в multibyte.
То же самое (на сборку проекта не влияет, м.б. при выполнении будут грабли).

Но после того, как последовал уроку:
http://www.c-sharpcorner.com/UploadFile/chaq686/how-to-create-and-implement-static-library-in-vcpp/
любезно подсказанному мне BlackEric, проект собрался.
Т.е. я не использовал классы, которые студия автоматом создает
//utlib.h
int hash();

//utlib.cpp
#include"utlib.h"
int hash()
{
    return 0;
}

Размер сильно уменьшился.
Ещё нужно было для либы задать ключик "/MTd" (многопоточная),
а был "MDd" (многопоточная DLL).

Всем спасибо за участие.
Теперь, нужно научиться добавлять классы в либу. Если это вообще для либы возможно.

PS. из примера я убрал дефайн
#ifndef __UTLIB__
#define __UTLIB__
int hash(); 
#endif

Не пойму, зачем это мне.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.