Почему может быть unresolved external, если функция есть?
От: Shmj Ниоткуда  
Дата: 28.06.23 23:19
Оценка:
У меня как в анекдоте:

Компьютер не видит принтера, я уже и монитор на него повернул, а он все равно пишет что не видит. Что мне делать?
— Пальцем покажи.


А конкретно. Добавил в проект заголовки и исходники вручную. Ошибка при линковке:

error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


Эта функция в пространстве имен myns1, класс Class1 точно есть. Сигнатура совпадает.

И еще же сотни функций, которые видны и с ними проблем нет. Однако это и еще с два десятка которые почему-то не видны линкеру, хотя вроде с ними все в порядке.

И вызывается из С++ не из C, думал в этом проблема. В проекте разные расширения файлов — и cc и cpp — вроде не должно быть проблемой?

В общем — из-за чего такое может быть? Может ли быть, если нарушен порядок сборки? Если может быть из-за нарушения порядка сборки — то хотелось бы мин. пример.

Еще думаю — может ли быть, если в проекте вперемешку с и с++ -файлы?
Отредактировано 28.06.2023 23:59 Shmj . Предыдущая версия . Еще …
Отредактировано 28.06.2023 23:29 Shmj . Предыдущая версия .
Re: Почему может быть unresolved external, если функция есть?
От: kov_serg Россия  
Дата: 29.06.23 03:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А конкретно. Добавил в проект заголовки и исходники вручную. Ошибка при линковке:


S>

S>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


S>Эта функция в пространстве имен myns1, класс Class1 точно есть. Сигнатура совпадает.

Вы уверены, может она где-то в ns2::ns3::myns1 попала, после неудачных инклюдов?
Re: Почему может быть unresolved external, если функция есть?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 29.06.23 04:58
Оценка:
Здравствуйте, Shmj, Вы писали:

S>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


S>Эта функция в пространстве имен myns1, класс Class1 точно есть. Сигнатура совпадает.


S>И еще же сотни функций, которые видны и с ними проблем нет. Однако это и еще с два десятка которые почему-то не видны линкеру, хотя вроде с ними все в порядке.


"Вроде"?

Найди чем под виндой делается показ экспортированных имён в объектнике или библиотеке и посмотри, что именно экспортируется.
The God is real, unless declared integer.
Re: Почему может быть unresolved external, если функция есть?
От: LaptevVV Россия  
Дата: 29.06.23 05:11
Оценка: -1
S>А конкретно. Добавил в проект заголовки и исходники вручную. Ошибка при линковке:
S>

S>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)

S>Эта функция в пространстве имен myns1, класс Class1 точно есть. Сигнатура совпадает.
Ты пишешь функция, а это же метод, судя по сигнатуре.

Насчет смеси С/С++ — тоже могут быть проблемы.
Имена декорируются по-разному в С и С++.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Почему может быть unresolved external, если функция есть?
От: vsb Казахстан  
Дата: 29.06.23 06:07
Оценка:
1. Внимательно посмотри на вызов линкера, убедись, что там объектный файл с этой функцией включается в линковку.

2. Через nm (если не путаю) посмотри, что в этом объектном файле эта функция действительно есть с нужными атрибутами.

3. Убедившись, что её там нет, найти переключатель в своём компляторе, который вместо компиляции выплёвывает текст после препроцессора. В gcc это -E. "Перекомпилируй" проект с этим переключателем и у тебя в .o файлах будет код на C++ после препроцессора. Скорей всего тут всё станет уже окончательно понятно.

Я бы так действовал.
Re: Почему может быть unresolved external, если функция есть?
От: rg45 СССР  
Дата: 29.06.23 06:22
Оценка:
Здравствуйте, Shmj, Вы писали:

S>У меня как в анекдоте:

S>

S>Компьютер не видит принтера, я уже и монитор на него повернул, а он все равно пишет что не видит. Что мне делать?
S>— Пальцем покажи.


Самоирония — это очень здоровое проявление.

S>А конкретно. Добавил в проект заголовки и исходники вручную. Ошибка при линковке:


S>

S>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


S>Эта функция в пространстве имен myns1, класс Class1 точно есть. Сигнатура совпадает.

S>И еще же сотни функций, которые видны и с ними проблем нет. Однако это и еще с два десятка которые почему-то не видны линкеру, хотя вроде с ними все в порядке.
S>И вызывается из С++ не из C, думал в этом проблема. В проекте разные расширения файлов — и cc и cpp — вроде не должно быть проблемой?
S>В общем — из-за чего такое может быть? Может ли быть, если нарушен порядок сборки? Если может быть из-за нарушения порядка сборки — то хотелось бы мин. пример.

Заочно определить проблему трудно, конечно. Но я бы посоветовал в первую очередь проверить настройки проектов. Декорирование имен чувствтительно к настройками проекта и, если в библиотеке и в приложении настройки разные, то это может быть причиной того, что линковщик не находит имена. И, если ты работаешь в Visual Studio, то имеет смысл собирать все настройки в специальных файлах, имеющих расширение "vsprops'. Один такой файл может подключаться сразу к нескольким проектам, тем самым синхронизируя все настройки. Кроме того эти файлы могут сслаться друг на друга, образуя иерархии, что позволяет разбивать настройки на группы и применять их на разных уровнях.

S>Еще думаю — может ли быть, если в проекте вперемешку с и с++ -файлы?


Запросто. По умолчанию c и c++ файлы обрабатываются разными компиляторами.
--
Re[2]: Почему может быть unresolved external, если функция есть?
От: kov_serg Россия  
Дата: 29.06.23 11:36
Оценка: +2
S>>

S>>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


В хедере определи эту функцию
double Function1(void)const; -> double Function1(void)const { throw; }
Если оно не будет ругаться на реализацию, значит она не компилируется и смотри define-ы
Re: Почему может быть unresolved external, если функция есть?
От: Кодт Россия  
Дата: 29.06.23 23:50
Оценка:
Здравствуйте, Shmj, Вы писали:

S>— Пальцем покажи.


Код покажи!

S>error LNK2001: unresolved external symbol "public: double __cdecl myns1::Class1::Function1(void)const " (?Function1@Class1@myns1@@QEBANXZ)


Это значит, функция объявлена, но не определена.
Покажи объявление и покажи определение.
И покажи, что написано в файле проекта (если, конечно, это не лютая портянка конфига Visual Studio).

S>И вызывается из С++ не из C, думал в этом проблема. В проекте разные расширения файлов — и cc и cpp — вроде не должно быть проблемой?


Смотря какая система сборки.
Например, если это makefile, в котором есть суффиксные правила
.c.o
,
.cpp.o
, и один из используемых суффиксов (например, .cc) забыли прописать, — проблемы будут.

S>В общем — из-за чего такое может быть? Может ли быть, если нарушен порядок сборки? Если может быть из-за нарушения порядка сборки — то хотелось бы мин. пример.


От порядка это не зависит, а вот от разбиения проекта на библиотеки очень даже может зависеть.

Например, у тебя есть файлы с говорящими именами:
— class1.h — объявление класса Class1 (и всех его функций-членов, естественно)
— class1_function1.cpp — определение Class1::Function1
— class1_function234.cpp — определение других членов
— client.cpp — клиентский код, использующий класс

И ты раскидал по подпроектам
— lib234 = class1.h, class1_function234.cpp
— lib1 = class1_function1.cpp, зависит от lib234
— exe = client.cpp, зависит от lib234
и вот пожалуйста, exe не видит определения Class1::Function1.

S>Еще думаю — может ли быть, если в проекте вперемешку с и с++ -файлы?


Надо полагать, эта перемешка распихана по разным подпроектам?
В противном случае, непонятно, зачем писать на голых сях, если можно писать сразу на плюсях.

А если есть подпроекты, то есть и шанс облажаться — засунуть какой-нибудь файл не в тот подпроект (или вообще не засунуть), и см.выше.
Перекуём баги на фичи!
Re: Почему может быть unresolved external, если функция есть?
От: Shmj Ниоткуда  
Дата: 30.06.23 05:17
Оценка: :))
Здравствуйте, Shmj, Вы писали:

S>Еще думаю — может ли быть, если в проекте вперемешку с и с++ -файлы?


Вот, кстати, причина была такой. Два одинаковых файла file1.cpp, но в разных папках. При сборке получилось что один файл file1.obj затер второй файл
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.