web-dev-qa-db-ja.com

CLionは外部ライブラリのヘッダーを解決しません

少し前に、C++ 1xでXCodeを使用して大きなヘッダーライブラリを開始しました。ライブラリの現在のレイアウトは()のようなものです(ls -R sponfからの部分的な出力)

sponf/sponf:
ancestors        sponf.h                sponf_utilities.h
categories       sponf_children.h       utilities
children         sponf_macros.h           

sponf/sponf/ancestors:
function.h       meter.h        set.h                    simulation.h

sponf/sponf/categories:
free_space.h     prng.h         random_distribution.h    series.h

sponf/sponf/children:
distributions    histogram.h    random                   simulations
meters           numeric        series                   spaces

sponf/sponf/children/distributions:
arcsine_der.h    exponential.h
box_muller.h     uniform.h

sponf/sponf/children/meters:
accumulator.h    timer.h

#... other subdirs of 'children' ...

sponf/sponf/utilities:
common_math.h    limits.h       string_const.h

#... other directories ...

このプロジェクトをCLionに移植したかったのですが、IDE(類似のAndroidStudio IDEに基づく))のようですが、いくつか問題が発生しています。

小さなテストプログラム

私はこの小さなプログラムをテストとして試しました:

#include <iostream>
#include <sponf/sponf.h>

using namespace std;

int main() {
    using space = sponf::spaces::euclidean_free_space<double, 3>;
    sponf::simulations::random_walk<space> rw;

    rw.step(1);

    std::cout << rw.position.value << std::endl;

    return 0;
}

プログラムはコンパイルされ、正常に実行されます。ただし、CLionはspaces名前空間(子ファイルの1つで宣言されています)もsimulations名前空間も認識しません。どちらも赤くマークされており、コンテンツを検査したり、定義に移動したりできません -クリックなどなど...

ライブラリの関連部分

"sponf.h"を見ると見つかります

#ifndef sponf_h
#define sponf_h

/* The classes below are exported */
#pragma GCC visibility Push(default)

// include some of the standard library files
// ...

#include <Eigen/Eigen>

#include "sponf_macros.h"

#include "sponf_utilities.h"
#include "sponf_children.h"

#pragma GCC visibility pop

#endif

"sponf_children.h""sponf.h"の横の最上位にあります)にいる間、

#ifndef sponf_locp_sponf_children_h
#define sponf_locp_sponf_children_h

namespace sponf {

// include some of the children
// ...

#include "children/spaces/euclidean_free_space.h"
#include "children/simulations/random_walk.h"

// include remaining children
// ...

}

#endif

各「子」ヘッダーには、対応する「祖先」または「カテゴリー」ヘッダー(「子」自体のスーパークラスを定義する)が含まれます。

CLionの反応

すべてのサブディレクトリとヘッダーを簡単に見つけるオートコンプリート予測にもかかわらず、この最後のファイルのすべてのインクルードディレクティブは赤でマークされ、 -それらのいずれかをクリックすると、ポップアップメッセージが表示されます

移動する宣言が見つかりません

エディタの右側のリボンは、

'、'または)が必要です

)予想される

予想される宣言者

期待されるタイプ

行方不明;

予期しない記号

これは、各includeステートメントで同じではありません(それぞれが2からこれらすべてのエラーを生成します)。

一方、CLionは、ほぼ同じ構造を持つすべてのEigenヘッダーを完全に見つけることができます!

両方のライブラリを/opt/local/includeに入れ、それに応じてCMakeLists.txtを変更しました

cmake_minimum_required(VERSION 2.8.4)
project(sponf)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

include_directories(/opt/local/include/sponf /opt/local/include/eigen3)

set(SOURCE_FILES main.cpp)
add_executable(sponf ${SOURCE_FILES})

CLionがプロジェクト構造を正しく解析できないのはなぜですか? XCode、/opt/local/include/sponf環境に/opt/local/include/eigen3およびHEADER_SEARCH_PATHSを含めた後。プロジェクトの変数は、同じ正確なプログラムをコンパイルしながら任意のヘッダーを見つけることができます。

他に知っておくべきことはありますか?私はそれを間違っていますか、それともCLionはまだそれほど成熟しておらず、これはただのバグです。これはCLionとCMakeツールチェーンへの私の最初のアプローチなので、それに関するあらゆる種類の情報が非常に高く評価されます!

非常に長い質問でごめんなさい、私はそれをそれ以上縮小することができませんでした...よろしくお願いします!

11
gianluca

ここで私はcigwin64を使用してWindowsで何をしたか。プロジェクトにEigenライブラリインクルードを使用したかった。固有ライブラリは/ usr/include/eigenに配置され、CMakeLists.txtを編集して追加します

  include_directories("/usr/include/eigen") 

その中に。これで、CLionはeigen lib内のすべてのソースファイルを見つけることができます。これもあなたが欲しかったものかもしれません。

11
GPrathap

Clion 2016.1.4にダウングレードすると問題が修正されます

0
fire1