我有以下项目结构:
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 更改。但它开始给我上面的错误。我该如何解决?还有没有更好的方法可以做到这一点?
即使在此行添加
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 项目中的某个位置到您的库或模块之一