Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
5 / 5 / 1
Регистрация: 25.04.2019
Сообщений: 530
1

Почему компилятор не видит метод объекта импортируемого из библиотеки

28.07.2023, 12:29. Показов 791. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я изучал использование библиотеки dll в своих проектах в библиотеке я описал в заголовочном файле свой объект вот его код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class __declspec(dllexport) MySocket
{
private:
    SOCKET mysocket;
    SOCKET  MyClientConn;
    int typesocket;
    int typeprotocol;
    //struct sockadr_in sockadrin;
 
    ADDRESS_FAMILY familyadress;
    int port;
    char  ipadress[15];
    sockaddr_in mysockadrin;
    void Set_Familyadress(int familyadress);
//  int Set_IPAdress_in();
    void Set_typeProtocol(int typeprotocol);
    void recieve();
    void Set_Adress(char adress_par[15]);
    void Set_TypeMySocket(int typesocet);
    void Set_Port(int port);
    int initSocket();
    
//  int mysocketSend(char Buf[BUFF_SIZE]);
//SOCKET mysocketconnect();
    int initSocketsInterfaces();
 
protected:
    int Set_IPAdress_in();
 
 
public:
    MySocket(int familyadress_par, int typesocket_par, int port_par,int typeprotocol_par, char ipadress[15]);
    int bindmysocket(int port, char ip_adress[15]);
    void InitSocket();
    char* receive();
    int receavedata();
    int mysocketsend(char Buf[BUFF_SIZE]);
    int recivedata();
    void ioctlmysocket(long cmd, long mode);
    int mysocketlisten();
    int mysocketconnect();
    int mysocketAcept();
    ~ MySocket();
};
определил реализацию метода receive
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* MySocket::receive()
  {
      int recvdata = recv(mysocket,Buffer,sizeof(Buffer),0);
 
 
      if (recvdata > 0)
 
          return (char*)&Buffer;
      else
          return nullptr;
 
  };
при попытке вызова этого метода из другого проекта
C++
1
2
3
4
5
6
7
8
9
10
MySocket Socket1=MySocket(AF_INET, SOCK_RAW,0, IPPROTO_IP, adr);
    //перевод сокета в неразборчивый режим
    u_long flag = 1;
    #define SIO_RCVALL 0x98000001
    Socket1.ioctlmysocket( SIO_RCVALL,flag );
    _IPHeader * hdr =(_IPHeader*) Socket1.receive();
    iph2str(hdr);
 //   while (true)
 //   {
         hdr = (_IPHeader*)Socket1.recieve();
Получаю в выводе error C2039: "recieve": не является членом "MySocket".
Что я делаю не так как исправить ошибку чобы проект собрался?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2023, 12:29
Ответы с готовыми решениями:

Компилятор не видит подключаемые библиотеки
Здравствуйте! ОС Ubuntu в папке /Desktop/make/ лежат файлы main.cpp и ctools.h пытаюсь запустить компилятор командой ...

Компилятор не видит функции из библиотеки AlgLib
Здравствуйте. Добавил к проекту "fasttransforms.h". Само имя библиотеки не вызывает ошибок, но не выполняется ни одна функция. Ошибка: ...

Компилятор не видит расширяющий метод
Сделал расширяющий метод ForbiddenSymbols() для класса string но среда просто его не видит. VS2012, .NET 4.5 Подскажите может оформил...

19
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,768
28.07.2023, 13:15 2
В основную программу какой h-файл подключен? там весь класс MySocket описан?
Получаю в выводе error C2039: "recieve": не является членом "MySocket".
Это же у вас ошибка именно компилятора, пока еще не линковщика, так?

Кстати, __declspec(dllexport) для описания классов, а не функций, точно применимо? (я не знаю)

Добавлено через 1 минуту
А вообще гонять между dll и основной программой классы, вызывать в них методы - это не то чтобы нельзя, но надо хорошо понимать все нюансы и ограничения такого подхода.
А потому сразу вопрос: вам это точно надо?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
28.07.2023, 13:16 3
spaceship1226, скорее всего разные версии заголовочных файлов используются. Проверьте, что нет нигде устаревших дубликатов вашего библиотечного заголовочного файла, которые могут подцепляться к проекту.

Добавлено через 56 секунд
Цитата Сообщение от KSergey9 Посмотреть сообщение
Кстати, __declspec(dllexport) для описания классов, а не функций, точно применимо?
Применимо, но не переносимо.
0
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,768
28.07.2023, 13:19 4
Цитата Сообщение от DrOffset Посмотреть сообщение
Применимо, но не переносимо.
А что оно делает в этом случае? все методы класса (видимо только публичные? или нет?) делает экспортируемыми из dll ?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
28.07.2023, 13:28 5
Цитата Сообщение от KSergey9 Посмотреть сообщение
А что оно делает в этом случае?
Все функции-члены и статические члены данных экспортируются.
1
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
28.07.2023, 13:35 6
Цитата Сообщение от spaceship1226 Посмотреть сообщение
Получаю в выводе error C2039: "recieve": не является членом "MySocket".
Цитата Сообщение от spaceship1226 Посмотреть сообщение
C++
1
char* MySocket::receive()
Опечатка?
2
 Аватар для SmallEvil
3770 / 2698 / 762
Регистрация: 29.06.2020
Сообщений: 9,924
28.07.2023, 14:09 7
Цитата Сообщение от Undisputed Посмотреть сообщение
Опечатка
И в вызове так же, в двух вариантах.
Цитата Сообщение от spaceship1226 Посмотреть сообщение
_IPHeader * hdr =(_IPHeader*) Socket1.receive();
    iph2str(hdr);
 //   while (true)
 //   {
         hdr = (_IPHeader*)Socket1.recieve();
Так нужно уметь =)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
4459 / 2334 / 984
Регистрация: 01.06.2021
Сообщений: 8,007
28.07.2023, 14:22 8
А що современные ide не умеют очепятки вылавливать??
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
28.07.2023, 14:40 9
Royal_X, современные компиляторы даже умеют.
https://wandbox.org/permlink/yrvylVMmhn1sHn89
prog.cc:12:10: error: 'class Socket' has no member named 'recieve'; did you mean 'receive'?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
4459 / 2334 / 984
Регистрация: 01.06.2021
Сообщений: 8,007
28.07.2023, 14:44 10
DrOffset, у меня был риторический вопрос. Но хорошо, что вы привели пример.
0
5 / 5 / 1
Регистрация: 25.04.2019
Сообщений: 530
28.07.2023, 15:28  [ТС] 11
Очепятку устранил, проект использующий dll теперь собирается, но отлаживаться никак не хочет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    char adr[15] = "127.0.0.1";
 
    int sctp = 132;
    MySocket Socket1=MySocket(AF_INET, SOCK_RAW,0, IPPROTO_IP, adr);
    //перевод сокета в неразборчивый режим
    u_long flag = 1;
    #define SIO_RCVALL 0x98000001
   // Socket1.ioctlmysocket( SIO_RCVALL,flag );
    Socket1.ioctlmysocket(SIO_RCVALL, flag);
    _IPHeader * hdr =(_IPHeader*) Socket1.recieve();
    iph2str(hdr);
Ставлю точку останова на первом операторе char adr[15] = "127.0.0.1";
Запускаю отладчик и вижу на экране картинки скриншоты привожу в прикрепленных файлах. В чем проблема сейчас?Что нужно сделать чтобы программа работала корректно?
Миниатюры
Почему компилятор не видит метод объекта импортируемого из библиотеки   Почему компилятор не видит метод объекта импортируемого из библиотеки  
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
28.07.2023, 16:45 12
spaceship1226,
Скорее всего дело в том, что реализация используемого метода отсутствует в DLL.

1) Проверьте DLL на наличие реализации используемого метода который вызывает ошибку (исправьте если есть опечатки или добавьте реализацию которая отсутствует)
2) После исправлений скомпилируйте DLL заново
3) Попробуйте выполнить программу но уже используйте DLL которую собрали заново
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
28.07.2023, 17:07 13
Цитата Сообщение от Royal_X Посмотреть сообщение
у меня был риторический вопрос.
Я понял, что риторический. Но в вопросе было про IDE, а я добавил про компилятор.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
4459 / 2334 / 984
Регистрация: 01.06.2021
Сообщений: 8,007
28.07.2023, 17:41 14
DrOffset, я писал про ide, потому что не только современный компилятор, но и статический анализ кода и всякие IntelliSense тоже должны предупреждать об этом. Т.е. ТС ещё до компиляции должен был заметить опечатку.
Поэтому, учитывая, что IDE включает в себя и компилятор, а также, что опечатку IDE должна поймать даже ещё до компиляции, то я писал об IDE.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12847 / 6714 / 1805
Регистрация: 18.10.2014
Сообщений: 17,013
28.07.2023, 18:13 15
Цитата Сообщение от spaceship1226 Посмотреть сообщение
Получаю в выводе error C2039: "recieve": не является членом "MySocket".
Что я делаю не так как исправить ошибку чтобы проект собрался?
Вы нас обманываете - вот что вы делаете неправильно. Ошибка, которую вы процитировали, возникает не "при попытке вызова этого метода из другого проекта", как вы заявили в вопросе, а еще при попытке его определения еще в изначальном проекте, то есть в совсем другом месте. Причем ошибка - в точности того же типа, как и в вашей предыдущей теме: опечатка, приведшая к разным именам в объявлении и определении метода. Вы что, не сделали никаких выводов из той темы? На каждую опечатку - новую тему?

Цитата Сообщение от spaceship1226 Посмотреть сообщение
Запускаю отладчик и вижу на экране картинки скриншоты привожу в прикрепленных файлах. В чем проблема сейчас?
Запускаем Developer Command Prompt из Visual Studio. Делаем

Code
1
> undname ??1MySocket@@QEAA@XZ
Получаем

Code
1
2
3
4
5
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
 
Undecoration of :- "??1MySocket@@QEAA@XZ"
is :- "public: __cdecl MySocket::~MySocket(void) __ptr64"
Не находится определение деструктора класса. В вашем хедере деструктор объявлен. А где его определение?

P.S. В форуме приводят текст, а не картинки. Чтобы нам не нужно было набирать это ??1MySocket@@QEAA@XZ с вашей картинки. Я целый час ковырялся... Причем, обратите внимание, в этом сообщении я сделал это три раза!!1
0
 Аватар для swerg2
5 / 3 / 1
Регистрация: 07.09.2021
Сообщений: 17
28.07.2023, 20:17 16
Сделайте все в рамках одного ехе файла для начала. А то вы так долго будете выгребать ошибки, опечатки и прочее.
Потом если ещё будет надо разобьёте на exe и dll
0
5 / 5 / 1
Регистрация: 25.04.2019
Сообщений: 530
29.07.2023, 09:51  [ТС] 17
Определение деструктора имеется привожу его код
C++
1
 MySocket::~MySocket() { closesocket(mysocket); }
Меня смущает то что проект собирается без ошибок создается exe файл А отладка не идет.
Миниатюры
Почему компилятор не видит метод объекта импортируемого из библиотеки   Почему компилятор не видит метод объекта импортируемого из библиотеки  
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12847 / 6714 / 1805
Регистрация: 18.10.2014
Сообщений: 17,013
29.07.2023, 10:00 18
Так а где и как делается объявление класса с __declspec(dllimport)? Как это вообще у вас делается? У вас в хедере явно жестко прописано __declspec(dllexport).
0
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,768
29.07.2023, 12:08 19
Цитата Сообщение от spaceship1226 Посмотреть сообщение
А отладка не идет.
Не понятно что вас смущает.
У вас программа просто-напросто не запускается. Вернее запускается, Windows подгружает требуемые DLL и ищет в этих DLL требуемые функции (функции, которые желает импортировать ваш exe-файл). Указанная в сообщении функция не обнаруживается в DLL, на этом Windows все убивает, выводя диагностическое сообщение. Вот и "не идет отладка", до main дело и не доходит.
Вы просто так свой exe запустите, без отладчика - и увидите ровно это сообщение при старте.

Одно не пойму: на кой вам вся эта заморочка сдалась?
0
5 / 5 / 1
Регистрация: 25.04.2019
Сообщений: 530
29.07.2023, 13:50  [ТС] 20
Смущает то что проект был работоспособен до моего инсульта и выхода из строя системного диска Раньше я создавал и отлаживал проект в windows 8.1 после переустановки системы работаю в Windows 11.возможно в этом и проблема сейчас
я вхожу в режим отладки и вижу где происходит затык
при прохождении этого участка кода
C++
1
2
3
4
5
 //перевод сокета в неразборчивый режим
    u_long flag = 1;
    #define SIO_RCVALL 0x98000001
   // Socket1.ioctlmysocket( SIO_RCVALL,flag );
    Socket1.ioctlmysocket(SIO_RCVALL, flag);
В вызываемой функции
C++
1
2
3
4
5
6
7
8
9
 void MySocket::ioctlmysocket(long cmd_par,long mode_par)
 {
     u_long flag = mode_par;
    int iResult= ioctlsocket(mysocket,cmd_par, &flag);
    if (iResult != NO_ERROR) 
     {
        printf("ioctlsocket failed with error: %ld\n", iResult);
     };
 }//end ioctlmysocket
Выводится сообщение ioctlsocket failed with error:-1;Возможно в Windows11 запрещено использование неразборчивого режима.В Windows 8.1 такая проблема решалась запуском студии от имени администратора. Здесь тоже запускаю студию от имени администратора, но сокет не переводится в неразборчивый режим.
код завершения процесса -1073741819
Что я могу сделать для восстановления работоспособности проекта?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2023, 13:50
Помогаю со студенческими работами здесь

Почему компилятор не видит класс?
Либо я уже заработался, либо это какой-то мега-глюк. Не понимаю почему пишет ошибку что не видно класс в соседнем namespace. См скрины.

Почему компилятор не видит переменную [c]
public static void main(String args) { int k, c, j, a, b, d; j = 10; b = 2000; k = 3000; d = 4000; a =...

Почему компилятор не видит идентификатор?
Вот ошибки Ошибка (активно) E0260 отсутствует явный тип (требуется "int") Game Stats C:\GameCS\Game Stats\Game Stats\Game...

Почему компилятор не видит мои переменные?
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools |...

Почему компилятор не видит идентификатор GetTickCount64_mc?
Имеется участок кода unsigned _int64 t0 = GetTickCount64_mc(); Sleep(delay); unsigned _int64 t1 = GetTickCount64_mc(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Winforstrap или красявый дизайн своими руками на HTML+JS+Winform­s
anomal6 04.03.2025
Сидел тут вечером ковырял проект на MAUI, и как же глупо создаются пакеты MSIX и система обновлений пакета публикации, но не об этом. Бывает нужен современный дизайн программы а писать на MAUI,. . .
Формат данных для симуляции физики, посредством распространённы­­­­­­­х не обученных моделей.
Hrethgir 04.03.2025
Что-то как-то снова потерялось, зато катангенсы закатангесились в одном сообщении. На днях писал, что планирую для работы апгрейдить (на этот раз удачно) девайс для работы (конкретно - здоровья для,. . .
Концепция variadic
CoderHuligan 04.03.2025
Мне не очень нравится (а кому это нравится?) что у нас есть отдельно компилятор, отдельно линковщик, причем со своим собственным командным языком. При этом усложнении надо знать помимо языка. . .
Java Record или Kotlin Data Class: что лучше для неизменяемых данных
Wired 04.03.2025
Java Record и Kotlin Data Class — два мощных инструмента для обуздания неизменяемых структур данных, каждый со своим уникальным подходом к решению этой задачи. История их появления весьма. . .
Создание производительны­­­х API с Java и gRPC
Wired 04.03.2025
В мире микросервисной разработки вопрос производительности часто становится краеугольным камнем. И хотя REST API давно завоевал сердца разработчиков своей простотой и интуитивностью, при высоких. . .
Что нового в JDK 24
Wired 04.03.2025
JDK 24 — это настоящий прорыв в эволюции Java, который кардинально меняет правила игры. В этом релизе разработчики Oracle наконец-то довели до ума множество критически важных улучшений в. . .
Разработка блокчейн с использованием Java: смарт-контракты и dApp
Wired 04.03.2025
Погружаясь в мир блокчейн-разработки на Java, разработчик получает доступ к внушительному арсеналу инструментов. В отличие от Solidity, который "заперт" в экосистеме Ethereum, Java предоставляет. . .
WebAssembly в Kubernetes
stackOverflow 03.03.2025
В современной экосистеме облачных технологий WebAssembly (Wasm) становится все более значимым компонентом, предлагая уникальный подход к выполнению кода в распределенных системах. Эта технология. . .
GitHub Actions или Jenkins: Выбираем CI/CD платформу
stackOverflow 03.03.2025
Непрерывная интеграция и развертывание (CI/ CD) изменили подход к разработке программного обеспечения, превратив его в бесшовный процесс от написания кода до развертывания в продакшн. GitHub Actions и. . .
Автоматизация тестирования Pull Request в Kubernetes: Интеграция с GitHub Actions и GKE
stackOverflow 03.03.2025
Масштабные проекты с использованием Kubernetes требуют надежной системы тестирования изменений перед их внедрением в продакшн-среду. Традиционный подход с ручной проверкой Pull Request не справляется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru