Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подключение библиотеки, как подключить простую библиотеку 
V
    Опции темы
AmsTaFF
Дата 22.3.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.9.2009
Где: г. Москва

Репутация: нет
Всего: нет



простите за глупый вопрос, облазил все что можно... но так и не смог найти ответ.

Создаю простую библиотеку:
libmath.h
Код

int sum(int a,int b, float o);

libmath.c
Код

#include "libmath.h"
int sum(int a,int b,float o)
{
    return a+b;
}


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

usemathlib.c
Код

#include "stdafx.h"
#include <libmath.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    i = 5;
    j = 10;
    float o =7;
    sum(i,j,o);
    
    return 0;
}


добавляю в настройки Project->Properties->C/C++->General->Additional Include Dir. : F:\[ Education ]\C++ тренинг\libmath\libmath
и Project->Properties->Linker->General->Additional Library dir. : F:\[ Education ]\C++ тренинг\libmath\Release

при компиляции выдает такую ошибку:
1>math_user.obj : error LNK2001: unresolved external symbol "int __cdecl sum(int,int,float)" (?sum@@YAHHHM@Z)
1>F:\[ Education ]\C++ ЄЁхэшэу\math_user\Release\math_user.exe : fatal error LNK1120: 1 unresolved externals

что я сделал не правильно или чего не сделал. Делал все по гайду в microsoft, но там показан пример на консольном приложении CLR, а у меня обычное консольное приложение
PM MAIL ICQ Skype   Вверх
Леопольд
Дата 22.3.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(AmsTaFF @  22.3.2010,  11:40 Найти цитируемый пост)
libmath.c
Надо скомпилировать статически/динамически линкуемую библиотеку. В винде файл имеет расширение .lib/.dll в NIX .o/.os?
Не знаю как с динамической библиотекой, но со статической её надо добавить в проект в IDE или указать в параметрах командной строки при запуске компилятора (который потом передаст её линкеру).


Это сообщение отредактировал(а) Леопольд - 22.3.2010, 12:55


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 22.3.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(AmsTaFF @  22.3.2010,  11:40 Найти цитируемый пост)
скомпилировал, дальше создаю консольный проект, чтобы использовать эту библиотеку
Наверное тебе всё же не библиотека нужна, а раздельная компиляция. Т.е. реализация пишется в разных файлах .срр В хидерах ".h" пишутся заголовки, которые подключаются в остальные .сpp при помощи #include. 
Если так, то, если ты работаешь в ИДЕ, надо добавить оба файла *.cpp в проект. Заметь, что теперь они компилируются по очереди, после чего, в процессе линковки, из них создаётся исполняемый файл.

Это сообщение отредактировал(а) Леопольд - 22.3.2010, 12:56


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 22.3.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Одну директорию указывать мало, надо сам файл указать вот тут
Linker->Input->Additional Dependencies.
PM   Вверх
bsa
Дата 22.3.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



AmsTaFF, в хидере нужно перед декларацией функции писать extern "C", если функция у тебя реализована на языке С. Так как у С++ немного по другому организован алгоритм именования функций.
Код
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

int sum(int a,int b, float o);

#ifdef __cplusplus
} //extern "C"
#endif /* __cplusplus */

PM   Вверх
EvilsInterrupt
Дата 22.3.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



To AmsTaFF :
В С и С++ компилятся исходные файлы, как правило *.c, *.cpp, но не факт, читай ниже.

Чтобы скомпилировать проект, нужно компилятору подать исходные файлы проекта.
Это можно выполнить следующими способами:
1) Создать make-файл, в нем указать все исходные файлы, все необходимые тулзы, в том числе и компилятор и что надо сделать. Далее запустив тулзу make или аналогичную, получить результат!
2) Либо воспользоваться средой разработки. К примеру MS Visual Stuidio. Которая все за тебя сделает сама! ;) Но это только видимость.

Поговорим о MS Visual Studio. Не смотря на то что студиа многое может, ее нужно настраивать! Указывать где лежат файлы с инклудами, указывать линкеру файлы *.lib или указывать компилятору чего-нить.

Чтобы тебе скомпилить в новом библиотеке код используемый из твоей библиотеки, ты должен:
1) указывать в местах использования ф-ций, классов, структур и т.д. #include <your_lib.h> . Этим самым ты говоришь как выглядят функции библоитеки
2) Добавить их в проект или прописать в make-файле. Этими действиями ты говоришь компиллеру как перейти из места вызова функции(клиентская часть) в саму реализацию функции(библиотека).

Для того чтобы у тебя все запахало, вероятно, думаю ты забыл нажать правой кнопкой -> Add -> Exist or New и указать твой *.cpp файл , где исходный код функций библиотеки. ;)



Это сообщение отредактировал(а) EvilsInterrupt - 22.3.2010, 14:04
PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 22.3.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



ещё в visual studio нужно в явном виде указывать тип вызова:
Код

int [color=red]__stdcall[/color] sum(int a,int b, float o);

т.к. в проекте библиотеки у тебя может быть тип вызова по-умолчанию один, а в основном проекте - другой


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
AmsTaFF
Дата 22.3.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 17.9.2009
Где: г. Москва

Репутация: нет
Всего: нет



2Леопольд

я хочу написать более сложную библиотеку, которая будет использовать в другом проекте... и столкнулся с проблемой, что не могу присоединить библиотеку в проекту, нужна именно статическа библиотека .lib

2EvilsInterrupt
нужно именно библиотеку использовать, а не её исходные коды, если бы можно было исходники использовать, проблем бы не возникло. Спасибо за подробное объяснение )

2bsa
указал, спасибо

2azesmcar
спасибо, указал - запустил и скомпилилось, проблема решена

2borisbn
приму к сведению, спасибо

PM MAIL ICQ Skype   Вверх
xvr
Дата 23.3.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(AmsTaFF @  22.3.2010,  15:10 Найти цитируемый пост)
я хочу написать более сложную библиотеку, которая будет использовать в другом проекте... и столкнулся с проблемой, что не могу присоединить библиотеку в проекту, нужна именно статическа библиотека .lib
Для VC:
  •  Создаешь Solution
  •  В нем создаешь 2 проекта: твою библиотеку (тип проекта - статическая библиотека) и твое приложение
  •  В зависимостях проектов ставишь, что приложение (2й проект) зависит от библиотеки (1й проект). Остальное студия сделает сама
(П1 можно сделать автоматически, как часть П2)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.