我正在使用一个开源库,它提供了一个 .hpp 文件,其中定义了几个静态函数,如下面的代码。
当我在我的项目中两次包含这个文件时,我总是得到一个链接器错误,抱怨重复的符号。我很清楚函数被定义了两次,但我不知道如何解决这个问题。我曾尝试将函数标记为外部或内联但没有成功。
解决此问题的最佳方法是什么?
#ifndef OPENMVG_ROBUST_ESTIMATOR_ACRANSAC_H_
#define OPENMVG_ROBUST_ESTIMATOR_ACRANSAC_H_
#include <algorithm>
#include <cmath>
#include <iterator>
#include <vector>
#include <limits>
#include <iostream>
#include "openMVG/robust_estimation/rand_sampling.hpp"
namespace openMVG {
namespace robust{
static double logcombi(size_t k, size_t n)
{...}
...
编辑:我忘了说还有模板功能,这意味着我不能使用 .h 和 .cpp 文件。这就是他们使用 .hpp 文件的原因。在这个页面(http://www.cplusplus.com/doc/tutorial/templates/)的底部,它说链接器在这种情况下不应该产生错误。我使用 Xcode 作为标准设置的 IDE。显然这里有问题。链接器错误如下所示:
duplicate symbol __ZN7openMVG6robust13UniformSampleEmmPSt6vectorImSaImEE in:
/Users/chris/Library/Developer/Xcode/DerivedData/SfM_OpenMVG-dgkssozpvorbpphdefdpurfpdaqv/Build/Intermediates/SfM_OpenMVG.build/Debug/SfM_incremental_unified.build/Objects-normal/x86_64/SfMIncrementalEngine.o
/Users/chris/Library/Developer/Xcode/DerivedData/SfM_OpenMVG-dgkssozpvorbpphdefdpurfpdaqv/Build/Intermediates/SfM_OpenMVG.build/Debug/SfM_incremental_unified.build/Objects-normal/x86_64/computeMatches.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方案:事实证明,我所指的 hpp 文件包含一个文件,该文件定义了一个与原始文件中的一个函数同名的函数,这就是导致链接器错误的原因。我不知道为什么在仅包含一次 .hpp 文件时这甚至会首先起作用。