Проблема странной связи с Visual C ++ 2005 - PullRequest
1 голос
/ 29 июля 2010

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

Предпосылка: я использую 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 @ серная @@ 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 @ серна @@ QAEPAVQuark @@ W4Feature @ 2 @ MMMM @ Z»

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

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

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

Понятия не имею, заранее спасибо

Ответы [ 2 ]

1 голос
/ 29 июля 2010

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

0 голосов
/ 29 июля 2010

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

...