包含库时函数的多重定义

Multiple definiton of function when including library

本文关键字:定义 函数 包含库      更新时间:2023-10-16

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

我特别想包括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代码,但只有我自己?

您链接到的问题说明了一切-没有办法解决这个问题,而不修改头文件(或只是将它们包含在一个源文件中)。

例如,这一行在头文件中定义了一个非内联构造函数。在多个翻译单元中包含它将导致违反ODR规则。

解决这个问题的一种方法是将您的项目更改为仅头文件样式,即将您的实现移动到头文件。通过这种方式,您可以(或多或少地)保持项目的结构。然而,这绝对不是一个好的解决方案……