最初の背景 - Windows 7 64 ビットで正常にコンパイルおよび実行される 3 つの VS2010 C++/OpenCL プロジェクトがあります。Linux 64 ビット (Ubuntu/Debian) でそれぞれをコンパイルして実行しようとしています。最初の 2 つは Linux 上でコンパイルおよび実行されており、実際には外部ライブラリを使用していません。3 つ目は Boost 1.50.0 のみを使用し、最初の 2 つと同じ方法でコンパイルしていません。最初に、最初の 2 つを機能させるために何をしたかを見てみましょう。
- 無数のフォルダからソースだけを抽出しました。
- Windows 固有のコードを Linux 固有のコードに移植しました。
- すべてのソースをコンパイルして g++ コマンドを生成する bash スクリプトを作成しました。
- コンパイル スクリプトを実行して、出力ターゲット ファイルを生成しました。
bash スクリプトは次のとおりです。
#!/bin/bash
SOURCE=""
for i in `ls *.h *.cpp *.hpp`; do
SOURCE+="${i} "
done
COMMAND="g++ -I/home/junkie/downloads/boost_1_51_0 -o out ${SOURCE} -L/opt/AMDAPP/lib/x86_64/ -I/opt/AMDAPP/include -lOpenCL -fpermissive"
echo -e "\n"
echo -e "${COMMAND}"
echo -e "\n"
$COMMAND
exit $?
そして、次のようなコマンドを生成して実行します。
g++ -I/home/junkie/downloads/boost_1_51_0 -o out blah.cpp blah.h foo.hpp baz.cpp etc.cpp -L/opt/AMDAPP/lib/x86_64/ -I/opt/AMDAPP/include -lOpenCL -fpermissive
次のコマンドを使用してコンパイルします。
./compile.sh &> log; echo $?; grep -ci error log; wc -l log
ここで、C++ プロジェクトをコンパイルして Linux で実行するために、なぜこのような型破りで冗長な手段を採用したのか疑問に思われるかもしれません。私は Linux の C および C++ ツールチェーンに慣れていないため、これが仕事を成し遂げるために理解できる最も迅速で簡単なルートであり、最初の 2 つのプロジェクトを立ち上げて実行することができました。しかし、3 つ目はブーストを使用しており、この方法は機能していません。これらすべての奇妙なエラーの原因を突き止めるために、あなたの助けが必要です。
私が得ているエラーは、実際にはプロジェクト コードからではなく、Boost および AMD の opencl ライブラリ コードからのものです。これは、他のプロジェクトも opencl を使用しており、それらが正常に機能していたためです。
ブースト エラーの例を以下に示します。
foo.hpp:2331:1: error: unterminated argument list invoking macro "BOOST_PP_CAT_I"
In file included from main.cpp:4:
foo2.hpp:1610:1: error: unterminated argument list invoking macro "BOOST_PP_CAT_I"
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: variable or field ‘BOOST_PP_CAT_I’ declared void /home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp: At global scope:
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: variable or field ‘BOOST_PP_CAT_I’ declared void
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected ‘;’ at end of input
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected ‘;’ at end of input
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected ‘}’ at end of input
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected unqualified-id at end of input
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected ‘}’ at end of input
/home/junkie/downloads/boost_1_51_0/boost/preprocessor/cat.hpp:22: error: expected ‘}’ at end of input
foo.hpp:2331:1: error: unterminated argument list invoking macro "BOOST_PP_CAT_I"
opencl エラーの例を以下に示します。
In file included from /opt/AMDAPP/include/CL/cl_platform.h:35,
from /opt/AMDAPP/include/CL/cl.h:30,
from bar.h:7,
from fooGPU.hpp:6,
from main.cpp:4:
/usr/include/stdint.h:49: error: expected ‘;’ before ‘typedef’
In file included from /opt/AMDAPP/include/CL/cl.h:30,
from bar.h:7,
from fooGPU.hpp:6,
from main.cpp:4:
/opt/AMDAPP/include/CL/cl_platform.h:41: error: expected unqualified-id before string constant
main.cpp:136: error: expected ‘}’ at end of input
main.cpp:136: error: expected unqualified-id at end of input
main.cpp:136: error: expected ‘}’ at end of input
main.cpp:136: error: expected ‘}’ at end of input
私が使用しているブーストインクルードは次のとおりです。
#include <boost/preprocessor/punctuation/paren.hpp>
#include <boost/preprocessor/punctuation/comma.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_base_of.hpp>
#include <boost/mpl/not.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/logical.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/array.hpp>
最後に、私の質問は次のとおりです。
1) 私が使用している構築方法に照らして、これらのエラーの根本的な原因は何ですか?また、この問題を解決するにはどうすればよいですか? ファイルまたはライブラリのインクルードの順序は重要ですか? ビルド済みのバイナリを必要とするものは何も使用していないため、ビルド済みのバイナリではなく、ブーストのドキュメントで指示されているように、g++ コマンドの一部としてブーストのローカル ソース ダウンロードを使用しています。
2) 私は物事を構築する私の方法がかなり原始的であることを理解しています. 私はmakeを学んでおり、調査する必要があるcmakeとkdevelopを使用するためのいくつかの推奨事項を見てきました。make を使用する際の主な問題は、これらのプロジェクトが make を念頭に置いて作成されていないため、makefile を作成するためのソース ファイル間の依存関係グラフを認識していないことです (私の考えが正しければ、私はまだ make についてかなり初心者です)。それ)。物事をより良く行うための推奨事項があれば、教えてください。
ありがとう。