Не удается получить сообщение об ошибке «DllMain уже определено» - PullRequest
5 голосов
/ 08 февраля 2012

Я пытаюсь написать библиотеку .dll для целей внедрения .dll. И из-за этого факта у него должна быть подпрограмма под названием DllMain, поскольку именно она будет использоваться в качестве точки входа. Я думаю, что моя проблема может быть связана с тем, что я создаю ссылки на статическую библиотеку, которую я написал, которая использует потоки и мьютексы из afxmt.h. Потому что где-то внизу, включение этого заставляет компоновщик ссылаться из mfcs100ud.lib, который, очевидно, содержит свою собственную версию DllMain.

Вот файл, который доставляет мне неприятности:

dllmain.cpp

#include "stdafx.h"
#include <stdio.h>
#include "NamedPipeLogger.h"

static CNamedPipeLogger m_PipeLogger("Log.txt");

BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved)
{
}

Вот файл stdafx.h, в который входит dllmain.cpp.

stdafx.h

#pragma once

#define _AFXDLL
#include <Afx.h>

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers

Вот мое сообщение об ошибке:

Ошибка 32, ошибка LNK2005: _DllMain @ 12 уже определено в dllmain.obj D: \ xxxxx \ xxxxx \ xxxxxx \ mfcs100ud.lib (dllmodul.obj)

Неужели я просто напортачил, потому что не могу изменить имя моей точки входа в Dll на что-то другое, кроме DllMain?

Ответы [ 4 ]

6 голосов
/ 10 ноября 2015

Во многих случаях это вызвано наличием _USRDLL в настройках препроцессора, где оно должно быть _LIB. Это связано с «Mll-файлами расширения MFC», которые я не думаю, что кто-либо еще делает сегодня, но мастер VS, похоже, предполагает, что вы действительно хотите использовать это, когда вы отмечаете «Использовать MFC» в мастере.

4 голосов
/ 23 апреля 2015

Недавно у меня возникла такая же или похожая проблема, и я нашел решение.

Фон

У меня есть проект MFC в Visual Studio 2013 Pro, который генерирует DLL. У меня есть несколько модулей .c в проекте, которые я могу сделать, условно указав конструкцию 'extern "C" , отключив предварительно скомпилированные заголовки для этих файлов C, и - в моем случае - отключение унаследованного принудительного включения , которое было извлечением stdafx.h из значений по умолчанию проекта.

Задача

Однажды, после успешного использования этого метода в нескольких файлах C, когда я попытался добавить еще один, я получил следующую ошибку.

1>Link:
1>  All outputs are up-to-date.
1>mfcs120d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
1>     Creating library C:\path\to\project\build_dir\myproj.lib and object C:\path\to\project\build_dir\myproj.exp
1>C:\path\to\project\build_dir\myproj.dll : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.

Решение

Я решил эту проблему, внедрив «Solution One» из Статья базы знаний Майкрософт Q148652 , «Ошибка LNK2005 возникает, когда библиотека CRT и библиотеки MFC связаны в неправильном порядке в Visual C ++». Это заставляет компоновщик связывать библиотеки в правильном порядке.

Шаги:

  1. Щелкните правой кнопкой мыши проект, выберите «Свойства».
  2. Убедитесь, что вы вносите изменения для всех конфигураций и всех платформ.
  3. На левой панели перейдите к Linker & rarr; Ввод.
  4. На правой панели разверните Дополнительные зависимости, выберите .
  5. Добавить mfcs120d.lib.

На основании статьи проекта кода Устранить ошибку LNK2005: _DllMain @ 12 уже определен в msvcrtd.lib (dllmain.obj) в проектах MFC ", я полагаю, мне может понадобиться добавить еще одну библиотеку в этот список когда-нибудь, но сейчас у меня это работает.

1 голос
/ 09 февраля 2012

Ну, я думаю, что я бросил полотенце на это (вроде).Я был в состоянии по крайней мере справиться со всеми своими проблемами.Мне просто пришлось прекратить использование некоторых классов Microsoft.

Я коснулся этого в описании проблемы, но я вспоминаю, что у меня начались трудности с компиляцией, как только я начал включать:

#include <afxmt.h>
#include <afxwin.h>

Так что я прошел и выяснил, что именно я использовал, что требовало этих включений.Я использовал метод AfxBeginThread () , а классы CMutex и CCriticalSection .Поэтому я подумал, может быть, если бы я мог просто уйти от каких-то запатентованных вещей Windows, что, возможно, мои проблемы исчезнутЭто означает удаление всех включений, и, а затем устранение ошибок компиляции с помощью более стандартного кода C ++.Вот что я сделал:

  • Вместо использования AfxBeginThread () я использовал CreateThread ().
  • Вместо использования CMutex и CCriticalSection я использовал структуру CRITICAL_SECTION с сопутствующими процедурами.

После этого я смог скомпилировать .dll, и он работал нормально.

0 голосов
/ 17 января 2017

Я получил ошибку, когда переместил #include afxdllx.h из dllmain.cpp в StdAfx.h. Мой проект работает без этого включают также

...