Получение ошибок «не объявлено в области» для всего, объявленного в символически связанном заголовке - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь переместить отдельные модули в файловую структуру проекта и столкнулся с любопытной проблемой - несмотря на использование символических ссылок для всех заголовков и -I [путь ссылки] во всех командах компиляции, компилятор объявляет, что каждая вещь, котораябыло объявлено в заголовке, расположенном в другой папке.

Вот структура файла:

../
├── bin
│   ├── libutil.dbg.a
│   └── obj
│       ├── reactor.dbg.o
│       ├── testFile.dbg.o
│       └── timer.dbg.o
├── include
│   ├── cpp98_utils.hpp -> ../src/reactor/reactor.hpp
│   ├── errorTemplate.hpp -> ../src/reactor/reactor.hpp
│   ├── reactor.hpp -> ../src/reactor/reactor.hpp
│   ├── testFile.hpp -> ../src/reactor/reactor.hpp
│   ├── testHeader.hpp -> ../src/reactor/reactor.hpp
│   └── timer.hpp -> ../src/reactor/reactor.hpp
└── src
    ├── makefile
    ├── reactor
    │   ├── reactor.cpp
    │   ├── reactor.hpp
    │   └── reactor_test.cpp
    ├── timer
    │   ├── timer.cpp
    │   ├── timer.hpp
    │   └── timer_test.cpp
    └── utils
        ├── cpp98_utils.hpp
        ├── errorTemplate.hpp
        ├── testFile.cpp
        ├── testFile.hpp
        └── testHeader.hpp

Командная строка, используемая для создания символических ссылок (тот же синтаксис, что и для всех заголовков):

ln -sr -T -f reactor/reactor.hpp ../include/reactor.hpp 

Командная строка, используемая для компиляцииобъектный файл, который не компилируется:

g++ -MT ../bin/obj/reactor_test.o -MMD -MP -MF ../.d/reactor_test.Td -std=c++98 -ansi -Wall -pedantic-errors -Wextra -I../include -c -g -o ../bin/obj/reactor_test.o reactor/reactor_test.cpp -lm -pthread -lglut -lboost_system -lboost_thread

Пример вида ошибок, которые генерирует компилятор:

reactor/reactor_test.cpp:76:34: error: ‘ARR_LEN’ was not declared in this scope
  for (size_t i=0; i<ARR_LEN(tests); ++i)
                                  ^
reactor/reactor_test.cpp:80:4: error: ‘cout’ is not a member of ‘std’
    std::cout << test_names[i] << " successful." << std::endl;
    ^
reactor/reactor_test.cpp:80:52: error: ‘endl’ is not a member of ‘std’
    std::cout << test_names[i] << " successful." << std::endl;

Это продолжается до тех пор, пока я не включу всеошибки, они все одинаковые.

Сам заголовок:

#ifndef __TEST_HPP__
#define __TEST_HPP__

#include <cstdlib>        // size_t, EXIT_FAILURE, EXIT_SUCCESS
#include <iostream>       // std::cout, std::endl
#include <pthread.h>      // pthread_create, pthread_join
#include <stdio.h>        // perror
#include <errno.h>        // perror
#include <unistd.h>       // usleep
#include <time.h>         // clock_gettime
#include <cstring>        // strcmp
#include <sys/stat.h>     // open
#include <fcntl.h>        // open
#include <exception>  // set_terminate, terminate, set_unexpected, unexpected
#include <sys/types.h> /* mode_t */

#include "errorTemplate.hpp"
#include "testFile.hpp"

namespace ilrd
{

#ifndef MAX
#define MAX(a, b) TemplateMax(a, b)
template <typename T>
inline T TemplateMax(const T& a, const T& b)
{
    return (((a)>(b))?(a):(b));
}
#endif

#define TEST_SCALE 20
#define STOP_TEXT "Stop!"
#define CLIENT_TEXT "ping!"

#define ARR_LEN(x) (sizeof(x)/sizeof(x[0])) // expands to number of cells in
                                            // array


}// ilrd

#endif // __TEST_HPP__

Попытка изменить путь включения приводит к тому, что компилятор генерирует фатальные ошибки «файл не найден», поэтомунаходит файлы по ссылкам.

Есть идеи, что может быть причиной этого?

...