首先是一些背景知识 - 我有三个 VS2010 C++/OpenCL 项目,它们在 Windows 7 64 位上编译和运行良好。我一直在尝试在 Linux 64 位(Ubuntu/Debian)上编译和运行它们。前两个是在 linux 上编译和运行,并没有真正使用任何外部库。第三个仅使用 Boost 1.50.0,并且没有使用与前两个相同的方法进行编译。因此,首先让我回顾一下我为使前两个工作正常所做的工作。
- 我只从无数文件夹中提取了源代码。
- 我将 windows 特定代码移植到 linux 特定代码。
- 我编写了一个 bash 脚本来生成带有所有源的 g++ 命令来编译它们。
- 我运行编译脚本来生成输出目标文件。
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++ 工具链的新手,这是我能想到的最快和最简单的方法来完成工作,它确实让前两个项目启动并运行。但是,第三个使用 boost 并且这种方法不起作用,我需要您的帮助来弄清楚所有这些奇怪的错误是什么。
我得到的错误实际上不是来自项目代码,而是来自 Boost 和 AMD 的 opencl 库代码,这很奇怪,因为其他项目也在使用 opencl 并且工作正常。
下面是一些 boost 错误的示例。
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)根据我正在使用的构建方法,这些错误的根本原因是什么?我该如何解决这个问题?文件或库包含的顺序是否重要?我使用 boost 的本地源下载作为我的 g++ 命令的一部分,按照 boost 文档的指示,而不是预构建的二进制文件,因为我没有使用任何需要预构建二进制文件的东西。
2)我意识到我的构建方式非常原始。我正在学习 make 并且我已经看到了一些使用 cmake 和 kdevelop 的建议,我需要研究这些建议。使用 make 的主要问题是这些项目在编写时没有考虑到 make 所以我不知道源文件之间的依赖关系图来创建 makefile (如果我的想法正确的话;我对它)。如果您对如何做得更好有任何建议,请赐教。
谢谢。