1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|||||||||||
1 | |||||||||||
Неразрешенный внешний символ при вызове методов класса в сторонней программе (dll)07.11.2016, 14:46. Показов 2114. Ответов 10
Метки нет (Все метки)
Здравствуйте. Пишу dll для клавиатурного хука. Есть класс, который я написал для работы с файлами. Он прекрасно компилируется в родной программе, но при попытках вызвать методы класса в программе не родственной классу возникают ошибки с неразрешенным внешним символом. Не уверен, что нужен код класса(он рабочий), но скину:
FileWork.h
0
|
07.11.2016, 14:46 | |
Ответы с готовыми решениями:
10
Ссылка на неразрешенный внешний символ при использовании DLL Ошибка при написании класса: error LNK2019: ссылка на неразрешенный внешний символ Ссылка на неразрешенный внешний символ в шаблоне класса В элементарной программе из учебника - error LNK2019: ссылка на неразрешенный внешний символ |
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|||||||||||
07.11.2016, 19:10 [ТС] | 2 | ||||||||||
Код dll:
Только сейчас понял, какую хрень я написал в dll, но это не про класс, про хук. P.S. Буду благодарен, если расскажите еще и про хуки(как их правильно устанавливать). Добавлено через 46 минут Мда... Дело точно не в dll. Написал программу:
Ошибка 4 error LNK2019: ссылка на неразрешенный внешний символ "public: bool __thiscall FileWork::Close(void)" (?Close@FileWork@@QAE_NXZ) в функции _main D:\Projects\VS\MiniPrpoj\ZASHKVAR\FileWorkTest\FileWorkTest\main.obj FileWorkTest Ошибка 3 error LNK2019: ссылка на неразрешенный внешний символ "public: bool __thiscall FileWork::BaseCreate(char *,unsigned long)" (?BaseCreate@FileWork@@QAE_NPADK@Z) в функции _main D:\Projects\VS\MiniPrpoj\ZASHKVAR\FileWorkTest\FileWorkTest\main.obj FileWorkTest Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall FileWork::FileWork(void)" (??0FileWork@@QAE@XZ) в функции _main D:\Projects\VS\MiniPrpoj\ZASHKVAR\FileWorkTest\FileWorkTest\main.obj FileWorkTest Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall FileWork::~FileWork(void)" (??1FileWork@@QAE@XZ) в функции "public: void * __thiscall FileWork::`scalar deleting destructor'(unsigned int)" (??_GFileWork@@QAEPAXI@Z) D:\Projects\VS\MiniPrpoj\ZASHKVAR\FileWorkTest\FileWorkTest\main.obj FileWorkTest Ошибка 5 error LNK1120: неразрешенных внешних элементов: 4 D:\Projects\VS\MiniPrpoj\ZASHKVAR\FileWorkTest\Debug\FileWorkTest.exe FileWorkTest Добавлено через 46 секунд *1.txt
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
07.11.2016, 19:16 | 3 |
Это компилируется. А вот не линкуется - да.
cpp файл в проект-то добавил? PS. Явный вызов деструктора тут не нужен. Используй delete .Добавлено через 2 минуты Алексей_Либанов, по поводу первоначального вопроса - см. тут: https://msdn.microsoft.com/ru-... 27t8c.aspx
0
|
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|
07.11.2016, 19:49 [ТС] | 4 |
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
07.11.2016, 20:42 | 5 |
Алексей_Либанов, Ну, насколько я понимаю, последний тест свелся к тому, что этот класс использовался в одном проекте, без dll. И там тоже появились ошибки компоновщика. Если это так, то, вероятно, cpp файл забыли добавить в проект (то, что он лежит в папке рядом - ничего не значит, нужно, чтобы система сборки в IDE про него знала). Ну, или, если я не прав, нужно подробнее рассказать в каком сейчас состоянии проект.
Это я так мягко намекаю, что проблемы нынешние и прошлые - это разные проблемы, у них разные причины и делать общие выводы о них обеих - не надо.
0
|
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|
07.11.2016, 21:23 [ТС] | 6 |
DrOffset, Еще раз описываю ситуацию, возможно Вы меня не так поняли. Есть родной проект, в котором я писал класс. В нем все линкуется. Я создал другой проект(никак не связанный с проектом в котором я писал класс). В папку этого проекта я закинул FileWork.cpp и FileWork.h, в main.cpp проекта написал #include "FileWork.h". Вопрос: что еще нужно написать/подключить, чтобы в проекте можно было вызывать методы класса?
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
07.11.2016, 21:41 | 7 |
Ко мне можно (нужно) на "ты".
К сожалению понять можно было по-разному, т.к. информации было дано не совсем достаточно. К этому проекту этот класс планируется подцеплять из dll? * Если да, то закидывание cpp - это лишнее, ненужное действие. Вместо этого нужно было предоставить библиотеку импорта (*.lib) и прописать ее в настройках компоновщика. Во-вторых, нужно было пометить соответствующие функции, как и сам класс, как экспортируемые иначе функции не будут видны извне, получим как раз похожие на представленные ошибки компоновщика. Об этом была дана ссылка выше. Вот, если угодно, более подробно: https://habrahabr.ru/post/150327/ https://msdn.microsoft.com/ru-... k134d.aspx https://msdn.microsoft.com/ru-... w9f6x.aspx https://msdn.microsoft.com/ru-... k134d.aspx * Если же класс просто хочется использовать как есть из этого нового проекта, то закидывание cpp файла в папку недостаточно, нужно еще подключить его в дереве проекта. Об этом я пытался сказать выше. Кроме всего прочего, следует помнить, что имена функций и классов в С++ подвержены name mangling`у, что сводит на "нет" возможность взаимодействия (с использованием этих имен) между модулями, созданными в разных компиляторах. Поэтому обычно организуют взаимодействие через переносимый С-интерфейс. Из этого правила есть исключения, но необходимо оставаться в строгих рамках. Пример можно глянуть здесь. Еще хочу заметить, что я пока даже не пытался касаться изначальной проблемы с хуком, т.к. по ней не хватает информации. Я думаю любой, кто соберется ответить, будет благодарен пошаговому описанию действий, в варианте "получилось" и в варианте "не получилось", начиная от компиляции тестового приложения и заканчивая установкой хука в целевую программу.
0
|
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|
07.11.2016, 21:58 [ТС] | 8 |
Как "подключить его в дереве проекта"? Это именно то, что мне нужно.
Добавлено через 2 минуты Пока я до конца не освоил dll Потом, кстати, планирую переписать класс в dll (но это уже совсем другая история)
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
07.11.2016, 22:00 | 9 |
Сообщение было отмечено Алексей_Либанов как решение
Решение
1
|
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
|
|
07.11.2016, 22:11 [ТС] | 10 |
Спасибо, от ошибок линковщика я избавился. Но вопрос с ловушками остался. Буду экспериментировать, потому что пока, все сводится к "не работает". Когда выявлю фактическую проблему - напишу. Ну а пока, не мог бы ты скинуть исходник программы для хукинга(если есть), хочу посмотреть, как там все устроено.
P.S. Инфы и интернете вроде много, но по фату, толковых статей по типу "хуки с нуля" практически нет.
0
|
DrOffset
|
07.11.2016, 22:17
Неразрешенный внешний символ при вызове методов класса в сторонней программе (dll)
#11
|
Не по теме: Под рукой, к сожалению, нет. По вопросам организации хуков в windows лучше обратиться в этот форум: https://www.cyberforum.ru/win-api/ Начать, наверное, стоит с поиска. Наверняка есть уже примеры.
0
|
07.11.2016, 22:17 | |
Создание шаблона класса ( Ошибка: ссылка на неразрешенный внешний символ ) Ошибка неразрешенный внешний символ при подключении curl Ошибка при работе с SFML: LNK2001 неразрешенный внешний символ Ссылка на неразрешенный внешний символ __divti3 (при делении __int128) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |