私は、以下のコードのように定義されたいくつかの静的関数を含む .hpp ファイルを提供するオープン ソース ライブラリを使用しています。
このファイルをプロジェクトに 2 回含めると、シンボルの重複に関するリンカ エラーが常に発生します。関数が 2 回定義されていることはよく知っていますが、これを解決する方法がわかりません。関数 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/ ) の一番下に、この場合、リンカーはエラーを生成すべきではないと書かれています。標準設定のIDEとしてXcodeを使用しています。どうやらここに何か問題があるようです。リンカー エラーは次のようになります。
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 ファイルには、元のファイルの関数の 1 つと同じ名前の関数を定義するファイルが含まれており、それがリンカー エラーの原因であることが判明しました。.hpp ファイルを 1 回インクルードするだけで、なぜこれが最初に機能したのかわかりません。