Подтвердить что ты не робот

CLion не разрешает заголовки из внешней библиотеки

Некоторое время назад я начал большую библиотеку заголовков в С++ 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 (на основе аналогичной IDE AndroidStudio), но я получаю некоторые проблемы.

Малая тестовая программа

Я пробовал эту небольшую программу в качестве теста:

#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 (объявленное в одном из файлов-потомков) или пространство имен simulations; они оба отмечены красным цветом, и я не могу проверить их содержимое и не переходить к их определениям с помощью -clicking и т.д. и т.д....

Соответствующие части библиотеки

В "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 в этом последнем файле становятся красными и -clicking на любом из них приводит к всплывающему сообщению

Невозможно найти объявление, чтобы перейти к

в то время как правая лента редактора сигнализирует много ошибок, таких как

',' или) ожидается

) ожидается

Ожидаемый декларатор

Ожидающий тип

Отсутствует;

Неожиданный символ

которые не являются одинаковыми для каждого оператора 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 env. переменная проекта, может найти любой заголовок при компиляции той же самой точной программы.

Есть ли что-нибудь еще, что мне нужно знать? Я делаю это неправильно или это то, что CLion еще не зреет, и это всего лишь жалкая ошибка? Это мой первый подход к CLion и инструментальной цепочке CMake, поэтому всякая информация об этом будет принята с благодарностью!

Извините за очень длинный вопрос, мне еще не удалось его уменьшить... Спасибо заранее, ребята, скоро увидимся!

4b9b3361

Ответ 1

Вот что я сделал в окнах с помощью cigwin64. Я хотел использовать библиотеку Eigen в моем проекте. Собственная библиотека помещается в /usr/include/eigen, а затем редактирует CMakeLists.txt и добавляет

  include_directories("/usr/include/eigen") 

. Теперь CLion может найти все исходные файлы в собственной lib. Возможно, это то, что вы тоже хотели.

Ответ 2

Переход к клиенту 2016.1.4 устраняет проблему