C ++ lnk2005 ошибка на двух файлах с внешним "C", почему? - PullRequest
0 голосов
/ 25 марта 2012

У меня есть CPP с внешними функциями "C".Если они все в одном файле, все отлично работает.Я хочу разделить функции на разные файлы только для организационных целей.

Итак, допустим, у меня есть два файла:

File_One.cpp

#pragma once
#include "stdafx.h"
#include <windows.h>
#include "Functions.h"
#include "Variables.h"
#include <string>
#include "File_Two.cpp"

extern "C"
{
    __declspec(dllexport) void MethodOne()
    { 
        MethodTwo();
    }
}

File_Two.cpp

#pragma once
#include "stdafx.h"
#include <windows.h>
#include "Functions.h"
#include "Variables.h"
#include <string>

extern "C"
{
    __declspec(dllexport) void MethodTwo()
    { 
    }
}

Я попытался переставить заголовки включения в другом порядке, и даже не помещал заголовки include в file_one.cpp, кроме include для file_two.cpp, но всегда получаю одни и те же ошибки.

1) ошибка LNK1169: найден один или несколько кратно определенных символов

2) ошибка LNK2005: _MethodTwo уже определен в File_One.obj

Что именно я делаю неправильно?Что я должен сделать, чтобы это исправить?

Спасибо!

1 Ответ

1 голос
/ 25 марта 2012

Возможно, у вас возникли проблемы, потому что вы включили файл File_two.cpp в файл File_one.cpp. Происходит то, что File_two.cpp и File_one.cpp компилируются и связываются. Но поскольку File_two.cpp включено в File_one.cpp, компоновщик видит две копии MethodTwo и не может решить, какой из них использовать.

Вы должны переместить объявления в заголовок:

File_two.h:

extern "C"
{
    __declspec(dllexport) void MethodOne()
}

И включите это вместо этого.

File_one.h:

extern "C"
{
    __declspec(dllexport) void MethodOne();
}

Затем определите функции с их телом в соответствующих файлах .cpp. Нет необходимости для extern "C" в исходных файлах.

...