运行 make 给出“多重定义……首先在此处定义”错误

问题描述 投票:0回答:1

我有以下项目结构:

ProjectX
├── Module1
│   ├── Module2
│   │   ├── CMakeLists.txt
│   │   ├── src
│   │   │   └── Module2.cpp // has #include "Common.h"
│   │   └── include
│   ├── CMakeLists.txt
│   ├── src
│   │   └── Class1.cpp  // has #include "Common.h"
│   │   └── Class2.cpp // has #include "Common.h"
│   └── include
│       └── Class1.h  // has #include "Class2.h"  ** NOTE **
├── Module3
│   ├── CMakeLists.txt
│   ├── src
│   │   └── Class3.cpp // has #include "Common.h"
│   └── include
├── src
│   └── NewClass.cc // newly added
├── include
│   ├── NewClass.h // newly added
│   └── Common.h // newly added
└── CMakeLists.txt

Commonn.h
包含可供所有模块使用的
NewClass
实例:

#ifndef GLOBALS_H
#define GLOBALS_H

#include "NewClass.h"

namespace ProjectX {
    extern NewClass instance1 = NewClass();
    extern NewClass instance2 = NewClass();
    extern NewClass instance2 = NewClass();
}

#endif // GLOBALS_H

我有以下 CMakeFiles 内容:

ProjectX/CMakeFiles.txt

add_library(${PROJECT_NAME} SHARED 
src/NewClass.cc
include/NewClass.h
include/Common.h
)

ProjectX/Module1/CMakeFiles.txt
ProjectX/Module2/CMakeFiles.txt

set(PROJECTX_DIR ${PROJECT_SOURCE_DIR}/../)
target_include_directories(${PROJECT_NAME}
    PUBLIC ${PROJECTX_DIR}/include/
)

ProjectX/Module3/CMakeFiles.txt

set(PROJECTX_DIR ${PROJECT_SOURCE_DIR}/../../)
target_include_directories(${PROJECT_NAME}
    PUBLIC ${PROJECTX_DIR}/include/
)

另请注意顶部 ASCII 层次结构中指定的五个

#include

我在运行时遇到以下错误

make

/usr/bin/ld: CMakeFiles/Module1.dir/src/Class1.cpp.o:(.bss+0x10): multiple definition of `ProjectX::instance1'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x10): first defined here
/usr/bin/ld: CMakeFiles/Module1.dir/src/Class1.cpp.o:(.bss+0x20): multiple definition of `ProjectX::instance2'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x20): first defined here
/usr/bin/ld: CMakeFiles/Module1.dir/src/Class1.cpp.o:(.bss+0x0): multiple definition of `ProjectX::instance3'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x0): first defined here
/usr/bin/ld: Module2/libModule2.a(Module2.cpp.o):(.bss+0x20): multiple definition of `ProjectX::instance2'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x20): first defined here
/usr/bin/ld: Module2/libModule2.a(Module2.cpp.o):(.bss+0x0): multiple definition of `ProjectX::instance3'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x0): first defined here
/usr/bin/ld: Module2/libModule2.a(Module2.cpp.o):(.bss+0x10): multiple definition of `ProjectX::instance1'; CMakeFiles/Module1.dir/src/Class2.cpp.o:(.bss+0x10): first defined here
collect2: error: ld returned 1 exit status

在添加

NewClass.cpp
NewClass.h
Common.h
之前,一切都运行良好。我想添加可用作 ProjectX 所有模块的实用程序的功能。这就是为什么我按照上面的解释进行编码和 CMakeLists 更改。但它开始给我上面的错误。我该如何解决?还有没有更好的方法可以做到这一点?

c++ cmake makefile gnu-make
1个回答
0
投票

即使在此行添加

extern
关键字

extern NewClass instance = NewClass(); 

这是一个定义,因为您直接为

instance
赋值。 您应该做的是在头文件中声明实例并在源文件中定义它们:

Common.h:

#ifndef GLOBALS_H
#define GLOBALS_H

#include "NewClass.h"

namespace ProjectX {
    extern NewClass instance1;
    extern NewClass instance2;
    extern NewClass instance2;
}

#endif // GLOBALS_H

一些源文件,也许是Common.cpp:

#include "Common.h"
#include "NewClass.h" // not necessarily needed

namespace ProjectX {
    NewClass instance1 = NewClass();
    NewClass instance2 = NewClass();
    NewClass instance2 = NewClass();
}

然后将此源文件添加到 CMake 项目中的某个位置到您的库或模块之一

© www.soinside.com 2019 - 2024. All rights reserved.