Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сообщение при линковке

284
16 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Попытался создать консольное приложение на Си++ без использования MFC, ATL, только STL, но при линковке выдается след. сообщение

nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in libcpmtd.lib(newop.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
.\Debug/parser.exe : fatal error LNK1169: one or more multiply defined symbols found

Использую VS2003, консольное приложение, конфигурации debug и release
398
16 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Пересоздай проект.
284
16 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Alexandoros
Пересоздай проект.


Не помогает

243
16 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by michael_is_98
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in libcpmtd.lib(newop.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
.\Debug/parser.exe : fatal error LNK1169: one or more multiply defined symbols found


Что-то многопоточное делаешь судя по libcmtd.lib Если так, то /NODEFAULTLIB должен тебя спасти.

284
17 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by pacific_7
Что-то многопоточное делаешь судя по libcmtd.lib Если так, то /NODEFAULTLIB должен тебя спасти.


Да нет, обычное приложение.
Странно, но проблема исчезла при включении файла <afxwin.h> в один из файлов проекта.
Вообще-то я хотел все сделать на STL и часть файлов в проекте вообще не требовали <afxwin.h>, другая часть работала через MFC.
Так вот, при линковке проекта, в котором ВООБЩЕ не используется MFC все линковалось.
При добавлении файлов, требующих MFC, возникала эта ошибка и приходилось в файлы, написанные на STL, добавлять <afxwin.h>.
В чем дело - непонятно.
В STL использовал <exception> и <string>

284
17 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by michael_is_98
Да нет, обычное приложение.
Странно, но проблема исчезла при включении файла <afxwin.h> в один из файлов проекта.
Вообще-то я хотел все сделать на STL и часть файлов в проекте вообще не требовали <afxwin.h>, другая часть работала через MFC.
Так вот, при линковке проекта, в котором ВООБЩЕ не используется MFC все линковалось.
При добавлении файлов, требующих MFC, возникала эта ошибка и приходилось в файлы, написанные на STL, добавлять <afxwin.h>.
В чем дело - непонятно.
В STL использовал <exception> и <string>


Похоже MFC переопределяет оператор new и delete, STL делает то же самое и происходит конфликт.

243
17 февраля 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by michael_is_98

Так вот, при линковке проекта, в котором ВООБЩЕ не используется MFC все линковалось.
При добавлении файлов, требующих MFC, возникала эта ошибка и приходилось в файлы, написанные на STL, добавлять <afxwin.h>.


Ну дык естессно - пытался винигрет написать и удивлялся почему без половины компонентов не получается :)

284
17 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by pacific_7
Ну дык естессно - пытался винигрет написать и удивлялся почему без половины компонентов не получается :)


Что значит винегрет?
Я переписываю приложение с MFC на STL. Естественно, при тестировании разные части приложения накладываются...
И потом я не уверен, что все можно написать на STL. Например, известен кому-либо способ вывода двумерной научной графики на STL? Я знаю только способ через GDI (соответственно MFC). Или вывода окна приложения.
И потом приложение все-таки линкуется при подключении <afxwin.h>.
А значит STL и MFC уживаются. если что-то реализовано лучше в одной библиотеки, чем в другой, можно ли их совмещать?

3
17 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
Попытался создать консольное приложение на Си++ без использования MFC, ATL, только STL, но при линковке выдается след. сообщение


Попробуй поиграться с ключами компиляции /MT, /MLd и т.п.

284
17 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Green
Попробуй поиграться с ключами компиляции /MT, /MLd и т.п.


Не помогает.
Кстати, заметил тут еще одну деталь. Если использовать перегрузку new, которую дает MFC, то в окне при отладке будет сообщено об ошибке освобождения ОЗУ (например, когда программист забыл удалить выделенный объем ОЗУ).
Если перегрузку new делает STL, этого не происходит. Т.е. в этом случае уловить ошибку не удастся при отладке.
Т.е. что-то реализовано лучше в MFC, что-то в STL.
Есть ли возможность использовать сразу несколько библиотек?
Т.е. интерфейс делать в MFC, а внутреннюю архитектуру - с использованием STL?

Обработка исключ. ситуаций - особый вопрос. Думаю и эту часть лучше делать с использованием STL.

284
22 февраля 2006 года
michael_is_98
587 / / 25.02.2005
ОТвечаю сам себе - нужно в каждый файл Си++ включить первым файл afx.h. Тогда восстанавливается правильный порядок использования библиотек при линковке.
398
22 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Скорее всего в каждый файл нужно включить "stdafx.h" - прекомпилер хедер.

Но в остальном ты чегото нетого делаеш. Как это ты собрался перенести мфц в консоль? Рисовать будеш менюшки, а-ля TurboVision?? Во первых стл нормально работает с с мфц, а ошибки у тебя из-за частичного исключения мфц из проекта. Короче винигрет, как сказал pacific_7. Во вторых чтоб рисовать придется юзать или апи или мфц, что почти одно и тоже, в стл нету графичиских средств.

Так что ты куда переписывать собрался - ниче непонятно.
284
22 февраля 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Alexandoros
Скорее всего в каждый файл нужно включить "stdafx.h" - прекомпилер хедер.

По сути это тоже самое что и включение afx.h. Проблема описана в MS Knowledge Base.

Но в остальном ты чегото нетого делаеш. Как это ты собрался перенести мфц в консоль? Рисовать будеш менюшки, а-ля TurboVision?? Во первых стл нормально работает с с мфц, а ошибки у тебя из-за частичного исключения мфц из проекта. Короче винигрет, как сказал pacific_7. Во вторых чтоб рисовать придется юзать или апи или мфц, что почти одно и тоже, в стл нету графичиских средств.

Так что ты куда переписывать собрался - ниче непонятно.


Переписывать собственные структуры, которые реализовал, не зная STL. Вернее заменить их на стандартизированные и документированные классы, которые входят в STL. stack, list уже есть и городить что-то свое не имеет смысла.
Сейчас меня интересует класс, которые бы позволял хранить имена переменных и быстро их находить.

Перенести мфц в консоль не собираюсь - конечно же не об этом речь. А вот то, что STL уживается с MFC нужно было сказать сразу. Чтобы не возникало вопроса в том, какой выбрать класс - CString или string. Выбор последнего очевиден - это стандартизированный класс. CString как и сама MFC уходит.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог