2016-08-10 3 views
0

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

multiple definition of `B::Class1::Class1() 

Ниже излагается структура кода у меня есть здесь:

//.pro 
SOURCES += ../main.cpp \ 
      ../a/class1.cpp \ 
      ../b/class1.cpp  
HEADERS += \ 
      ../a/class1.h \ 
      ../b/class1.h 

// folder a, header 
#ifndef CLASS1_H 
#define CLASS1_H 

namespace A { 
class Class1 { 
public: 
    Class1(); 
}; 
}  
#endif // CLASS1_H 

// folder a, source 
#include "class1.h"  
using namespace A; 

Class1::Class1() { 
} 

// folder b, header 
#ifndef CLASS1_H 
#define CLASS1_H 

namespace B { 
class Class1 { 
public: 
    Class1(); 
    void doB(); 
}; 
}  
#endif // CLASS1_H 

// folder b, source 
#include "class1.h"  
using namespace B; 

Class1::Class1() { 
} 
void B::Class1::doB() {  
} 

// main.cpp 
#include "a/class1.h" 
using namespace A; 

int main(int argc, char *argv[]) { 
    Class1 c; 
} 

Что я делаю неправильно?

Вот результат компиляции:

14:39:54: Running steps for project test... 
14:39:54: Starting: "C:\Qt\Qt5.3.2\Tools\mingw482_32\bin\mingw32-make.exe" clean 
C:/Qt/Qt5.3.2/Tools/mingw482_32/bin/mingw32-make -f Makefile.Debug clean 
C:/Qt/Qt5.3.2/Tools/mingw482_32/bin/mingw32-make -f Makefile.Release clean 
mingw32-make[1]: Entering directory 'C:/Users/User/Downloads/namespace/build' 
Makefile.Debug:133: warning: overriding recipe for target 'debug/class1.o' 
Makefile.Debug:130: warning: ignoring old recipe for target 'debug/class1.o' 
mingw32-make[1]: Entering directory 'C:/Users/User/Downloads/namespace/build' 
Makefile.Release:133: warning: overriding recipe for target 'release/class1.o' 
Makefile.Release:130: warning: ignoring old recipe for target 'release/class1.o' 
del debug\main.o debug\class1.o debug\class1.o 
del release\main.o release\class1.o release\class1.o 
Nao foi poss¡vel encontrar C:\Users\User\Downloads\namespace\build\release\main.o 
Nao foi poss¡vel encontrar C:\Users\User\Downloads\namespace\build\debug\main.o 
mingw32-make[1]: Leaving directory 'C:/Users/User/Downloads/namespace/build' 
mingw32-make[1]: Leaving directory 'C:/Users/User/Downloads/namespace/build' 
14:39:55: The process "C:\Qt\Qt5.3.2\Tools\mingw482_32\bin\mingw32-make.exe" exited normally. 
14:39:55: Configuration unchanged, skipping qmake step. 
14:39:55: Starting: "C:\Qt\Qt5.3.2\Tools\mingw482_32\bin\mingw32-make.exe" 
C:/Qt/Qt5.3.2/Tools/mingw482_32/bin/mingw32-make -f Makefile.Debug 
mingw32-make[1]: Entering directory 'C:/Users/User/Downloads/namespace/build' 
Makefile.Debug:133: warning: overriding recipe for target 'debug/class1.o' 
Makefile.Debug:130: warning: ignoring old recipe for target 'debug/class1.o' 
g++ -c -pipe -fno-keep-inline-dllexport -std=c++1y -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I. -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtWidgets" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore" -I"debug" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\mkspecs\win32-g++" -o debug\main.o ..\main.cpp 
g++ -c -pipe -fno-keep-inline-dllexport -std=c++1y -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I. -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtWidgets" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtGui" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\include\QtCore" -I"debug" -I"C:\Qt\Qt5.3.2\5.3\mingw482_32\mkspecs\win32-g++" -o debug\class1.o ..\b\class1.cpp 
..\main.cpp:5:5: warning: unused parameter 'argc' [-Wunused-parameter] 
int main(int argc, char *argv[]) { 
    ^
..\main.cpp:5:5: warning: unused parameter 'argv' [-Wunused-parameter] 
g++ -Wl,-subsystem,windows -mthreads -o debug\test.exe debug/main.o debug/class1.o debug/class1.o -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -LC:/Qt/Qt5.3.2/5.3/mingw482_32/lib -lqtmaind -LC:\mingw482\mingw32\lib -LC:\Utils\icu32_52_1_mingw482\lib -LC:\utils\postgresql\pgsql\lib -LC:\utils\mysql\mysql\lib -LC:\opensll\lib -LC:\Qt\Qt5.3.2\5.3\mingw482_32/lib -lQt5Widgetsd -lQt5Guid -lQt5Cored 
debug/class1.o: In function `ZN1B6Class1C2Ev': 
C:\Users\User\Downloads\namespace\build/../b/class1.cpp:4: multiple definition of `B::Class1::Class1()' 
debug/class1.o:C:\Users\User\Downloads\namespace\build/../b/class1.cpp:4: first defined here 
debug/class1.o: In function `ZN1B6Class1C2Ev': 
C:\Users\User\Downloads\namespace\build/../b/class1.cpp:4: multiple definition of `B::Class1::Class1()' 
debug/class1.o:C:\Users\User\Downloads\namespace\build/../b/class1.cpp:4: first defined here 
debug/class1.o: In function `ZN1B6Class13doBEv': 
C:\Users\User\Downloads\namespace\build/../b/class1.cpp:7: multiple definition of `B::Class1::doB()' 
debug/class1.o:C:\Users\User\Downloads\namespace\build/../b/class1.cpp:7: first defined here 
debug/main.o: In function `main': 
C:\Users\User\Downloads\namespace\build/../main.cpp:6: undefined reference to `A::Class1::Class1()' 
collect2.exe: error: ld returned 1 exit status 
Makefile.Debug:81: recipe for target 'debug\test.exe' failed 
mingw32-make[1]: Leaving directory 'C:/Users/User/Downloads/namespace/build' 
Makefile:34: recipe for target 'debug' failed 
mingw32-make[1]: *** [debug\test.exe] Error 1 
mingw32-make: *** [debug] Error 2 
14:39:55: The process "C:\Qt\Qt5.3.2\Tools\mingw482_32\bin\mingw32-make.exe" exited with code 2. 
Error while building/deploying project test (kit: Desktop Qt 5.3 MinGW 32bit) 
When executing step "Make" 
14:39:55: Elapsed time: 00:01. 
+0

Какие команды выполняет 'qmake' печать? – aschepler

+5

Как вы можете различать два типа заголовков с тем же именем? Также включенные охранники одинаковы. Но эти проблемы не должны вызывать ошибку, которую вы показываете. – juanchopanza

+0

Хорошо, понял. Пространства имен позволяют мне выбрать конкретную область видимости из набора областей. Чтобы представить эти области, я помещаю их в разные файлы (разные имена файлов). Я должен использовать пространства имен, если эти области содержат символы с тем же именем. – KcFnMi

ответ

3

Похоже QMAKE не поддерживает файлы с тем же именем в разных каталогах. В результате он пытается создать как/class1.cpp, так и b/class1.cpp в один файл debug/class1.o, а затем дважды связать этот файл.

Попробуйте переименовать один из ваших * .cpp файлов.

+0

Ну, вот в чем дело. Я пытался понять, как использовать пространства имен, чтобы иметь «файлы с тем же именем в разных каталогах». Итак, проблема здесь скорее в 'qmake', чем в C++, могу ли я сказать это? – KcFnMi

+0

@KcFnMi Кто вам сказал, что пространства имен и имена файлов связаны вообще? Это недостаток 'qmake', вы не можете обойти его, выполняя ничего, кроме: 1. изменения имени файла или 2. изменения самого qmake и, конечно, не путем изменения содержимого файла! –

+0

Я слушаю, как некоторые люди говорят о cmake, это альтернатива qmake (в этом случае)? – KcFnMi

Смежные вопросы