Нерешенная проблема внешних символов - PullRequest
2 голосов
/ 02 ноября 2011

У меня проблема.Я получаю сообщение об ошибке, и я не уверен, почему это происходит.

2>Home.obj : error LNK2019: unresolved external symbol "**void __cdecl LogAString(char *,...)**" (?LogAString@@YAXPADZZ) referenced in function "**public: static void __cdecl X::Home::HomeStart(void)**" (?HomeStart@Home@X@@SAXXZ)
2>Widget.obj : error LNK2001: unresolved external symbol "void __cdecl LogAString(char *,...)" (?LogAString@@YAXPADZZ)
2>J:\src\out.dll : fatal error LNK1120: 1 unresolved externals

Вот мой код:

Log.h

#pragma once

#include <iostream>
#include <cstdarg>

void LogAString(char* fmt, ...);
void LogAnError(char* fmt, ...);

Log.cpp

#include "Log.h"

#include <Util/String/String Formatting.h> // defines format(). Does not have any errors or issues.

void LogAString(char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vprintf(fmt, ap);
    va_end(ap);
};

void LogAnError(char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);

    auto formatted_string = format("ERROR: %s", fmt).c_str();
    LogAString(const_cast<char*>(formatted_string), ap);

    va_end(ap);
};

Home.cpp (extract)

#include "Home.h"
#include "Log.h"

namespace X {

void Home::HomeStart()
{
    while (true)
    {
        auto number_of_widgets = Widgets::Count();
        LogAString("Loading with %d widgets", number_of_widgets);
    }
}

} // namespace X

Я думал, что я объявил и определил функции в файлах header и cpp соответственно.Почему я получаю эти ошибки?Я был в этом в течение нескольких часов, и до сих пор не уверен, почему это происходит.Использование VC ++ на VS 2010.

На данный момент я не использую никаких внешних библиотек.Целью компиляции является DLL "out.dll".

Ответы [ 4 ]

3 голосов
/ 02 ноября 2011

Это ошибка компоновщика, а не ошибка компилятора. Это означает, что вы правы в том, что правильно указали файл заголовка в своем коде. На самом деле, ваш код успешно скомпилирован.

Но затем компоновщик вышел, чтобы найти ссылочные функции в библиотеках, на которые он указывал, и вернулся с пустыми руками. Ссылки на библиотеки определены в листе свойств для вашего проекта VC ++. Ваш проект выводит Out.dll? Похоже, что компоновщик ожидает один. Я бы изучил раздел Linker, а также какой файл генерирует ваша компиляция.

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

1 голос
/ 02 ноября 2011

Вы не забыли добавить Log.cpp в свой проект?

Если это так, откройте файл log.obj в шестнадцатеричном редакторе. Поиск строки LogAnError. Это будет частью большей декорированной строки. Используйте команду undname для декорирования . Сравните это с тем, что компоновщик не может разрешить. Определите разницу и исправьте функцию LogAnError, чтобы они снова соответствовали.

0 голосов
/ 02 ноября 2011

ОК, на основании вашего комментария:

Целью компиляции является DLL, "out.dll"

Я бы предположил, что вы используете этот out.dll в каком-то другом проекте. И когда вы пытаетесь сделать это, вы получаете вышеуказанные ошибки компоновщика. Если это так, то это происходит потому, что вы не экспортируете свои функции. Кроме того, иметь такие глобальные функции - плохая практика. Вы должны по крайней мере обернуть их в каком-то классе, например Использует или что-то другое и объявляет их статическими:

Пример Log.h:

#pragma once

#include <iostream>
#include <cstdarg>

class __declspec (dllexport) Utils
{
    public:
          static void LogAString(char* fmt, ...);
          static void LogAnError(char* fmt, ...);
};

Log.cpp должен оставаться почти таким же.

#include "Log.h"

#include <Util/String/String Formatting.h> // defines format(). Does not have any errors or issues.

void Utils::LogAString(char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vprintf(fmt, ap);
    va_end(ap);
};

void Utils::LogAnError(char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);

    auto formatted_string = format("ERROR: %s", fmt).c_str();
    LogAString(const_cast<char*>(formatted_string), ap);

    va_end(ap);
};

Теперь, когда вы используете .dll, ваши функции будут экспортированы и доступны для других ваших проектов. Вам также следует включить файл Log.h в ваши каталоги include и убедиться, что файл «out.dll» находится в той же выходной папке вашего основного проекта. Кроме того, вы должны добавить out.lib в дополнительные библиотеки.

Надеюсь, это ваша проблема. В следующий раз предоставьте более подробную информацию.

0 голосов
/ 02 ноября 2011

Возможно, пространство имен как-то связано с этим, работает ли оно без пространства имен X?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...