C ++: переключение с MSVC на G ++: глобальные переменные - PullRequest
1 голос
/ 28 апреля 2010

Недавно я перешел на Linux и хотел скомпилировать исходный код Visual Studio 2010 C ++, который использует только STL, на G ++.

Мой компьютер с Linux в данный момент недоступен, но я могу сначала попытаться рассказать вам, что происходит:

  • Когда я пытаюсь скомпилировать свой проект, все глобальные переменные, которые я использую в main и которые отлично работают на MSVC, приводят к myGlobalVar is not defined in this scope ошибкам.

Мой проект построен почти так же, как в примере ниже:

// myclass.h
class myClass
{
 // ....
};
extern myClass globalInstance;

// myclass.cpp
#include "myclass.h"
// myClass functions located here
myClass globalInstance;

// main.cpp
#include "myclass.h"
int main( )
{
    // Accessing globalInstance results in an error: Not defined in this scope
}
  • Что я делаю не так?
  • Где различия между G ++ и MSVC с точки зрения глобальных переменных?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

вам нужно скомпилировать следующим образом:

g ++ main.cpp myclass.cpp -o myapp

НЕ как следует: g ++ main.cpp -o myapp, который пропустит объявление глобальной переменной в файле myclass.cpp.

1 голос
/ 29 апреля 2010

Ваш пример кода должен прекрасно работать как в Linux, так и в Windows. Между GCC и MSVC не должно быть никаких различий в отношении видимости глобальных переменных. Я думаю, что более вероятно, что то, что вы видите, является симптомом другой проблемы.

Единственное, что я могу придумать, чтобы не допустить подобной проблемы, это "испортить" заголовочные файлы, если использовать для этого технический термин. Распространенной проблемой при переносе кода из Windows в Linux является чувствительность к регистру файлов заголовков. Принимая во внимание, что MSVC не будет заботиться, импортируете ли вы MyHeader.h как #include <myheader.h>, это определенно потерпит неудачу в Linux. Если ваш заголовок не включен, компилятор пропустит объявление extern и может привести к ошибке, которую вы видите.

...