【发布时间】:2013-05-23 15:00:08
【问题描述】:
我正在使用一个开源库,它提供了一个 .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 文件时这甚至会起作用。
【问题讨论】:
-
在询问编译器/链接器错误时,请始终在您的问题中包含实际的错误消息。或者,如果它们太多(数百个),则前几个和最后几个相关的。
-
我之前也有同样的错误。如果
static并不真正意味着很多。刚刚删除它。
标签: c++ function static linker duplicates