Ошибки компоновщика библиотеки сводят меня с ума - PullRequest
2 голосов
/ 13 марта 2012

Это снова я. Я вернулся с совершенно новым проектом и новой проблемой. Я пытаюсь реализовать что-то для Growl. Либо с использованием статической или общей библиотеки (оба предоставляются). Я включил необходимый заголовок и дал ссылку на библиотеку. (2 способа на самом деле, один раз через свойства проекта, а другой через утверждение прагмы). Тем не менее, я все еще получаю следующие ошибки компоновщика:

error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::Growl(enum Growl_Protocol,char const * const,char const * const,char const * * const,int)" (__imp_??0Growl@@QAE@W4Growl_Protocol@@QBD1QAPBDH@Z)
error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::~Growl(void)" (__imp_??1Growl@@QAE@XZ)
fatal error LNK1120: 2 unresolved externals

Строка кода, которая вызывает эти ошибки компоновщика, выглядит так:

const char *n[2] = { "username" , "password" };
Growl *growl = new Growl(GROWL_TCP,NULL, "Appname", (const char **const)n,2);

Файл заголовка включен в начало файла, и я ссылаюсь на следующую строку:

#include "..\\..\\..\\libs\\Growl\\growl++.hpp"
#pragma comment(lib, "..\\..\\..\\libs\\Growl\\libgrowl-static++.lib")

Источник заголовка можно найти здесь: https://github.com/psinnott/gntp-send/blob/master/headers/growl%2B%2B.hpp

Я получил готовые двоичные файлы со следующей страницы: https://github.com/psinnott/gntp-send/wiki/Windows

Некоторая дополнительная информация: у меня есть набор символов Project Propeties для использования многобайтового набора символов, я предполагаю, что это ни на что не должно влиять. Это также консольное приложение Win32.

Куда я иду не так?

Обновление:
Нашел это через гугл: http://groups.google.com/group/growl-for-windows/browse_thread/thread/6c48a62454d062f1

Следовал инструкциям:
Добавлен libgrowlstatic.lib (наряду с libgrowlstatic ++. Lib)
Добавлены определения препроцессора, GROWL_STATIC и GROWL_CPP_STATIC

Получено много ошибок, в том числе:

LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
fatal error LNK1169: one or more multiply defined symbols found

Поэтому я добавил следующую строку в Свойства проекта, Линкер, Командная строка:

/NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:LIBCMT 

Теперь я получаю больше ошибок, включая некоторые из следующих:

libgrowl-static.lib(tcp.obj) : error LNK2019: unresolved external symbol _atoi referenced in function _growl_tcp_parse_hostname
libgrowl-static.lib(tcp.obj) : error LNK2019: unresolved external symbol _strchr referenced in function _growl_tcp_parse_hostname
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _fseek referenced in function _growl_tcp_register
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _fopen referenced in function _growl_tcp_register
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _strcpy referenced in function _growl_udp_notify

Занимался этим несколько часов и, похоже, ничего не понял. 10+ просмотров и никаких ответов? Клянусь, я не ленивый. Я посмотрел один из ответов о библиотеках, но мне не повезло. Ничто не объясняет, почему это так. Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 13 марта 2012
#pragma comment(lib, "..\\..\\..\\libs\\Growl\\libgrowl-static++.lib")

Существует явное несоответствие между #pragma и способом компиляции вашего кода.Название библиотеки убедительно указывает на то, что это библиотека ссылок static , «статическая» в названии это ясно показывает.Сообщения об ошибках, однако, говорят о __declspec (dllimport), директиве, которая используется при компиляции кода, который #include заголовок, который предполагает, что код находится в DLL вместо статической библиотеки ссылок.

Другие ошибки, которые выполучить это тоже.Имеют значение настройки Project + Properties, C / C ++, генерация кода, библиотека времени выполнения.Вы используете параметр / MD, который подходит при работе с DLL.Библиотека, без сомнения, была скомпилирована с / MT, настройкой, подходящей для создания монолитного EXE-файла, в котором не используются библиотеки DLL.Вы пытаетесь связать два куска кода, которые были созданы с конфликтующими настройками, компоновщик падает при попытке справиться с этим.Об этом прямо говорится в сообщении об ошибке.

Вам нужно будет либо выкопать версию DLL библиотеки .lib, либо последовательно использовать / MT в остальной части кода.Обычно есть #define, который сообщает файлу .h, какую версию .lib вы собираетесь связать.

1 голос
/ 13 марта 2012

Это работает для меня. Предполагается, что вы хотите использовать статические библиотеки, а не DLL.

Свойства -> Конфигурация -> Свойства -> Каталоги VC ++

Add directory of unzipped sdk to include and library directories

Свойства -> Конфигурация -> Свойства -> C / C ++ -> Препроцессор

Add GROWL_STATIC and GROWL_CPP_STATIC to preprocessor definitions

Свойства -> Конфигурация -> Свойства -> C / C ++ -> Генерация кода

Change runtime library to multi threaded ( /MT or /MTd )

Свойства -> Конфигурация -> Свойства -> Линкер -> Ввод

Add ws2_32.lib , libgrowl-static.lib and libgrowl-static++.lib to additional dependencies
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...