我正在使用一个开源库,它提供了一个.hpp文件,其中定义了几个静态函数,如下面的代码。C++链接器错误与.hpp文件中的静态函数
当我在项目中包含这个文件两次时,我总是得到一个链接器错误,抱怨重复的符号。我很清楚这个功能被定义了两次,但我不知道如何解决这个问题。我试图标记extern或inline函数而没有成功。
解决此问题的最佳方法是什么?
#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文件一次。
当询问编译器/链接器错误时,请始终在您的问题中包含实际的错误消息。或者,如果其中有太多(数百),相关的前几个和最后几个。 – Angew
我也有过相同的错误。如果'静态'并不意味着很多。刚刚删除它。 – mr5