0

我最近为 PowerPC 交叉编译了 Boost 库并生成了线程和系统库。然后在我的目标上测试库,尝试了 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。我对此并不陌生,因此无法完全遵循。

有没有人遇到过类似的问题?我在一些帖子中读到缺少命名空间导致此错误,但我不确定这是否是我的问题。


编辑 我得到了关于这个问题的更多信息。首先,我认为问题出在命名空间上,所以我手动将命名空间更改为 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位置存在于我的包含路径中。

顺便说一句,我怎么知道包含了哪个文件?

4

1 回答 1

0

该问题与PowerPC 架构的 Cross Compile Boost library相同。省略了具有 dev_t 定义的包含路径,并使用了下一个包含路径。不幸的是,它还有一个文件 stdlib.h 没有 dev_t 结构的定义。我创建了软链接并确保编译器选择了正确的 stdlib.h 文件。

于 2013-03-08T02:19:59.603 回答