我尝试在项目的不同文件中包含库中的标题,并且我在库的某些函数上遇到了多个定义错误。 在阅读this question的答案后,我认为问题在于函数直接在库的头文件中实现。
我特别希望包含FastPFor中的文件codecfactory.h
和deltautil.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代码,只需更改我自己的代码吗?
答案 0 :(得分:2)
您链接的问题说明了一切 - 如果不修改标题(或只将它们包含在一个源文件中),就无法解决这个问题。
例如this行在标题中定义了非内联构造函数。将其包含在多个翻译单元中会导致违反ODR规则。
答案 1 :(得分:0)
解决此问题的一种方法是将项目更改为仅标题样式,即将实现移动到头文件。通过这种方式,您可以保留(更少)项目的结构。 但是,这绝对不是一个很好的解决方案......整个项目需要在对其中一个标题进行小的更改后进行编译......