2013-12-03 3 views
0

У меня есть около десятка функций, связанных с одной целью, и я пытаюсь создать библиотеку. Библиотека, которую я могу хранить в каталоге где-нибудь, где я могу включить в качестве каталога include, и просто занимаюсь своим делом, включая указанную библиотеку в моих проектах, которые требуют ее использования.Создание библиотек и устранение проблем с компоновщиками


Side Примечание:

Сначала я хотел бы сказать, я дал много времени в поиске ответа на этот вопрос. Я думал, что нашел решение, когда понял, что компоновщик будет вызывать ошибки, когда я включил библиотеку в несколько исходных файлов. Теперь, когда я это знаю, я снова искал ответ на мои беды. Я начал изучать другие библиотеки, которые я знаю, чтобы сделать то же самое или что я верю. Я смотрел на conio.h, поскольку я все время включаю его в функции kbhit() и getch(). Хотя я не понимал большую часть того, что у меня было, я искал несколько ключевых слов и обнаружил, что на самом деле это может включать определения функций через dll.

Я также сделал несколько поисков Google.


Чтобы объяснить, что я делаю, немного. Я создал 2 или 3 структуры данных, которые позволяют мне создавать куски данных с заголовками, которые определяют, какие данные и как их обрабатывать. Затем еще пара для чтения и записи этих фрагментов в файлы.

Чтобы облегчить создание этих структур, я создал автономные функции. Чтобы легко манипулировать этими структурами, я сделал еще более автономные функции.

Мне просто нужно включить библиотеку, которая прямо или косвенно определяет все эти функции и структуры. Как я могу это сделать? (не создавая множество инлайн)

+0

Какая платформа? linux или windows или ...? – doctorlove

+0

Вы пытаетесь поместить все в заголовочные файлы? – doctorlove

+0

@doctorlove Windows, я обновил теги, чтобы указать мою IDE. До этого момента я поставил все в один файл заголовка. Теперь я вижу, что это будет сложно или, скорее всего, невозможно. Я прошу помощи в определении альтернативного метода. –

ответ

1

Вы можете включить .lib зависимости в вашем коде, используя #pragma comment

#pragma comment (lib,"LibraryFileName.lib")

Вы можете прочитать больше о #pragma commenthere.

Обычно я хотел бы сделать файл Linker.h в моей душевой душе в моей библиотеке и включить этот файл в каждый заголовок, найденный в моей библиотеке. Вот пример этого.

#ifndef __GRAPHICCOMMUNICATOR_GUARD_linklib__ 
#define __GRAPHICCOMMUNICATOR_GUARD_linklib__ 

#if defined(_DEBUG) 
    #pragma comment (lib,"GraphicCommunicator-mt-d.lib") 
#elif !defined(_DEBUG) 
    #pragma comment (lib,"GraphicCommunicator-mt.lib") 
#else 
    #error link: no suitable library 
#endif 

#endif // __GRAPHICCOMMUNICATOR_GUARD_linklib__ 
+0

Просто так я могу убедиться, что понимаю ваше предложение. Переместите определения моих функций, включая определения функций члена класса, в файл cpp. Скомпилируйте этот файл в файл lib. затем продолжайте то, что вы говорите? –

+0

Затем вы можете включить свою библиотеку без использования pragmas – doctorlove

+1

@JoshC Вы объявляете свои функции и классы в файле заголовка, вы объявляете определение функций и функций класса в файле '.cpp'. В вашем файле заголовка вы указываете комментарий #pragma. Затем, когда вы включаете файл заголовка в другой проект, он автоматически свяжет 'lib'. – Caesar

1

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

В противном случае вам нужно переместить реализации в файлы cpp и создать статическую (или динамическую) библиотеку. Если вы учитесь, статичность может быть проще. Создайте новый проект и выберите «Статическая библиотека» из настроек приложения.

Чтобы использовать библиотеку можно использовать #pragma ответ от Цезаря, или просто добавить .lib к настройкам компоновщика в проектах, которые хотят использовать его вместе с #including заголовки вам нужно.

+0

Мне удалось успешно создать статическую библиотеку, когда я впервые выяснил, как сделать библиотеку из этого кода. Проблема, с которой я столкнулся, заключалась в том, что мне показалось, что мне нужно сделать больше, чем просто #include или «file.h», чтобы включить его. Я должен был добавить его в проект, или, как указано в документации, которую я прочитал. –

+0

@JoshC - это правильно: заголовок сообщает компилятору, какие функции определены в библиотеке. Вы ** связываете ** с библиотекой, чтобы получить эти функции. –

+0

Вы можете использовать комментарий pragma или сообщить настройки компоновщика о библиотеке, например. http://stackoverflow.com/questions/6093325/how-to-link-a-lib-in-visual-studio-2008-c – doctorlove

Смежные вопросы