0

私は最近、PowerPC 用の Boost ライブラリをクロスコンパイルし、スレッドとシステム ライブラリを生成しました。次に、ターゲットでライブラリをテストするために、Boost ライブラリのサンプル コードの 1 つを試し、以前にビルドされた 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 の定義を追加しました。エラーの 1 つが減少しました (つまり、ステートメントがコンパイルされました)。したがって、問題は div_t 構造体の定義の欠落にありました。

現在、構造体 div_t は、現在のファイル cstdlib に含まれているファイル stdlib.h で定義されています。ファイル名 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 ライブラリと同じでした。dev_t の定義を持つインクルード パスが省略され、次のインクルード パスが使用されました。残念ながら、dev_t 構造体の定義を持たないファイル stdlib.h もありました。ソフト リンクを作成し、コンパイラが正しい stdlib.h ファイルを取得するようにしました。

于 2013-03-08T02:19:59.603 に答える