Недавно я кросс-скомпилировал библиотеку Boost для PowerPC и создал поток и системную библиотеку. Затем, чтобы проверить библиотеку на моей цели, попробовал один из примеров кода в библиотеке Boost и попытался собрать двоичный файл, используя ранее созданную библиотеку Boost, но получил следующие ошибки компиляции
.
.
GNU C++ version 4.2.2 (powerpc-linux)
compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-113).
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128176
Compiler executable checksum: dd5a9a41381fa3b9978b2738b80f5a75
In file included from /shared/deps/powerpc/include/boost/config/platform/linux.hpp:15,
from /shared/deps/powerpc/include/boost/config.hpp:53,
from /shared/deps/powerpc/include/boost/thread/detail/platform.hpp:14,
from /shared/deps/powerpc/include/boost/thread/thread.hpp:12,
from helloworld.cpp:7:
4.2.2/cstdlib:106: error: '::div_t' has not been declared
4.2.2/cstdlib:107: error: '::ldiv_t' has not been declared
4.2.2/cstdlib:109: error: '::abort' has not been declared
4.2.2/cstdlib:110: error: '::abs' has not been declared
4.2.2/cstdlib:111: error: '::atexit' has not been declared
4.2.2/cstdlib:112: error: '::atof' has not been declared
4.2.2/cstdlib:113: error: '::atoi' has not been declared
.
.
Ниже приведен пример программы с библиотекой Boost
#include <boost/thread/thread.hpp>
#include <iostream>
void helloworld()
{
std::cout << "Hello World!" << std::endl;
}
int main()
{
boost::thread thrd(&helloworld);
thrd.join();
}
Сделать файл:
CC=ppc_4xx-gcc
CPP=ppc_4xx-g++
CFLAGS=-c -g -Wall -static -v
LDFLAGS_TARGET=-$(LDFLAGS_PowerPC)
LIBS_TARGET=$(LIBS_PowerPC)
CPPFLAGS=$(CPPFLAGS_COMMON) $(CPPFLAGS_PowerPC)
INCLUDES=-I/opt/ELDK/4.2/ppc_4xx/usr/include/ -I. -I/opt/ELDK/4.2/ppc_4xx/usr/src/u-boot-1.3.1/board/xilinx/common/ -I/opt/ELDK/4.2/ppc_4xx/usr/src/linux-2.6.24/arch/powerpc/boot/ -I4.2.2/
DEPSROOT=/shared/deps
COMMON_INCLUDES = $(DEPSROOT)/common/include
PowerPC_INCLUDES=$(DEPSROOT)/powerpc/include
CPPFLAGS_PowerPC=-I$(PowerPC_INCLUDES)
CPPFLAGS_COMMON = -I$(COMMON_INCLUDES)
PowerPC_LIBS=$(DEPSROOT)/powerpc/lib
LDFLAGS_PowerPC=-L$(PowerPC_LIBS)
LIBS_PowerPC=-lboost_thread -lboost_system
all: helloworld
helloworld: helloworld.o
$(CPP) -g helloWorld.o -o helloworld -static
helloworld.o: helloworld.cpp
$(CPP) $(CFLAGS) $(CPPFLAGS) $(INCLUDES) $(MODS) helloworld.cpp
clean:
rm -rf *.o helloWorld
Ошибка находится в файле cstdlib в расположении ниже
.
.
_GLIBCXX_BEGIN_NAMESPACE(std)
using ::div_t;
using ::ldiv_t;
using ::abort;
.
.
Макрос _GLIBCXX_BEGIN_NAMESPACE устанавливает пространство имен как стандартное с определенной видимостью. Я новичок в этом, поэтому не мог следовать этому полностью.
Кто-нибудь сталкивался с подобной проблемой? Я читал в некоторых сообщениях, что пространство имен отсутствует, вызывая эту ошибку, но я не уверен, что это проблема в моем случае.
РЕДАКТИРОВАТЬ
Я получил больше информации о проблеме. Сначала я подумал, что проблема связана с пространством имен, поэтому я вручную изменил пространство имен на std, но это не помогло. Затем я добавил определение структуры div_t непосредственно перед утверждением используя :: div_t; и одна из ошибок уменьшилась (то есть заявление было скомпилировано). Так что проблема была в отсутствии определения структуры div_t.
Теперь структура div_t определена в файле stdlib.h, который включен в текущий файл cstdlib. Когда я сделал поиск по имени файла stdlib.h, я нашел следующие ссылки
/opt/ELDK/4.2/ppc_4xx/usr/include/stdlib.h
/opt/ELDK/4.2/ppc_4xx/usr/include/bits/stdlib.h
/opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/tr1/stdlib.h
/opt/ELDK/4.2/ppc_4xx/usr/include/freetype2/freetype/config/ftstdlib.h
/opt/ELDK/4.2/ppc_4xx/usr/src/linux-2.6.24/arch/powerpc/boot/stdlib.h
/opt/ELDK/4.2/ppc_4xx/usr/src/linux-2.6.24-xenomai/arch/powerpc/boot/stdlib.h
Только первый файл имеет определение div_t, а не остальные. Обсуждаемый файл cstdlib находится в папке ../include/c++/4.2.2/, теперь если файл stdlib.h включен сюда какой из множества stdlib.h включен? Местонахождение /opt/ELDK/4.2/ppc_4xx/usr/include присутствует в моем пути включения.
Кстати, как мне узнать, какой файл включен?
Проблема была такая же как Библиотека Cross Compile Boost для архитектуры PowerPC. Путь включения, который имел определение dev_t, был опущен, и был использован следующий путь включения. К сожалению, в нем также был файл stdlib.h, в котором не было определения структуры dev_t. Я создал программные ссылки и убедился, что компилятор выбрал правильный файл stdlib.h.
Других решений пока нет …