Некоторое время назад я начал большую библиотеку заголовков в С++ 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, поэтому всякая информация об этом будет принята с благодарностью!
Извините за очень длинный вопрос, мне еще не удалось его уменьшить... Спасибо заранее, ребята, скоро увидимся!