Странная проблема с компоновкой Visual C++ 2005

помогите пожалуйста, у меня странная проблема, никак не могу решить.

Предпосылка: я использую Visual C++ 2005 на Windows 7 x64, и я уверен, что мой код не имеет фатальных недостатков, потому что с g++ под Linux он работает хорошо.

Я разрабатываю приложение, которое использует статическую библиотеку, также разработанную мной.

На этапе ссылки приложения я получаю две загадочные ошибки LNK2019.

Это заголовок одного из классов библиотеки:

namespace sulfur
{
class Quark
{
public:
... various methods
void addAccel(const Vec2 &a);
... various methods
private:
... various data
};
}

Очевидно, что в файле cpp я предоставляю реализацию для addAccel с точно такой же подписью.

Когда я пытаюсь связать приложение с библиотекой, обнаруживаются ВСЕ остальные функции-члены, кроме addAccel.

Компоновщик ищет символ "?addAccel@Quark@@QAEXABV?$TemplateVec2@M@Atlax@@@Z"

в то время как в файле .lib есть (который я нашел с помощью dumpbin) «?addAccel@Quark@sulfur@@QAEXABV?$TemplateVec2@M@Atlax@@@Z». Единственная разница здесь в том, что компоновщик ищет искаженное имя без части пространства имен, и я не знаю, почему.

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

Вторая ошибка очень похожа. У меня есть другой заголовок в библиотеке:

namespace sulfur
{
class Cluster
{
...
Quark *addQuark(sulfur::Feature feat, float x, float y, float m=0.1f, float aF=0.01f);
...
};
}

и предоставляется правильный файл реализации. Как и раньше, все остальные методы связаны правильно, но не addQuark.

Компоновщик ищет "?addQuark@Cluster@sulfur@@QAEPAVQuark@@W4Feature@2@MMMM@Z"

но в библиотеке есть "?addQuark@Cluster@sulfur@@QAEPAVQuark@2@W4Feature@2@MMMM@Z".

На этот раз разница заключается в отсутствии первой «2» между «@» в версии, которую ищет компилятор.

Это не первый раз, когда я создаю это приложение с помощью Visual Studio, и оно всегда линкуется нормально, за исключением этого раза с последними изменениями.

я ничего не понимаю, заранее спасибо


person Mitridas    schedule 29.07.2010    source источник
comment
Если вы запустите последние два через undname.exe, вы увидите, что на самом деле это одна и та же ошибка — один метод для class Quark, а другой — для class sulfur::Quark.   -  person Rup    schedule 29.07.2010
comment
Да, но я не могу понять, почему компоновщик ищет класс Quark за пределами пространства имен, потому что его даже не существует.   -  person Mitridas    schedule 29.07.2010


Ответы (2)


Где и как реализована функция void addAccel(const Vec2 &a);? Вы уверены, что не пропускаете префикс Quark:: при реализации функции?

person wilx    schedule 29.07.2010
comment
Реализация addAccel находится в файле Quark.cpp, как и все остальные методы класса, и реализована следующим образом: voidser::Quark::addAccel(const Vec2 &a) { force+=massa; кластер-›пробуждение(); } и я вызываю его из приложения следующим образом: Vec2 power(...); state.selQ-›addAccel(мощность); где state.selQ имеет тип Quark . - person Mitridas; 29.07.2010

Ну, я только что решил проблему. Там два ошибочных предварительных объявления (вне пространства имен) класса Quark и класса Cluster. По какой-то причине g++ был в порядке с этим, в то время как VC++ справедливо жаловался на это. В любом случае, спасибо.

person Mitridas    schedule 29.07.2010