包含库时的多功能定义

时间:2015-07-14 15:56:26

标签: c++ include

我尝试在项目的不同文件中包含库中的标题,并且我在库的某些函数上遇到了多个定义错误。 在阅读this question的答案后,我认为问题在于函数直接在库的头文件中实现。

我特别希望包含FastPFor中的文件codecfactory.hdeltautil.h。我不知道它是否与我的问题相关,但我将其包含在我的cmake项目中,并在我的CMakeLists.txt中使用此代码:

include_directories(../../FastPFor/headers)
add_library(FastPFor STATIC ../../FastPFor/src/bitpacking.cpp
                                ../../FastPFor/src/bitpacking.cpp
                                ../../FastPFor/src/bitpackingaligned.cpp
                                ../../FastPFor/src/bitpackingunaligned.cpp
                                ../../FastPFor/src/horizontalbitpacking.cpp 
                                ../../FastPFor/src/simdunalignedbitpacking.cpp
                                ../../FastPFor/src/simdbitpacking.cpp
                ${HEADERS}
                )

如果我只包含一次文件,一切正常。但是一旦我在两个.cpp文件中使用它们,我就会遇到这些错误:

CMakeFiles/dbgen.bin.dir/queries/Query5.cpp.o: In function `vsencoding::BitsWriter::BitsWriter(unsigned int*)':
Query5.cpp:(.text+0x8420): multiple definition of `vsencoding::BitsWriter::BitsWriter(unsigned int*)'
CMakeFiles/dbgen.bin.dir/queries/Query13Naive.cpp.o:Query13Naive.cpp:(.text+0x7a50): first defined here

有什么方法可以解决这个问题,而不必更改FastPFor代码,只需更改我自己的代码吗?

2 个答案:

答案 0 :(得分:2)

您链接的问题说明了一切 - 如果不修改标题(或只将它们包含在一个源文件中),就无法解决这个问题。

例如this行在标题中定义了非内联构造函数。将其包含在多个翻译单元中会导致违反ODR规则。

答案 1 :(得分:0)

解决此问题的一种方法是将项目更改为仅标题样式,即将实现移动到头文件。通过这种方式,您可以保留(更少)项目的结构。 但是,这绝对不是一个很好的解决方案......整个项目需要在对其中一个标题进行小的更改后进行编译......