gpt4 book ai didi

c++ - 使用 Boost 的 Visual Studio C++/OpenCL 项目未在 Linux 上使用 g++ 进行编译

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:59 24 4
gpt4 key购买 nike

首先是一些背景知识——我有三个 VS2010 C++/OpenCL 项目,它们可以在 Windows 7 64 位上正常编译和运行。我一直在尝试在 Linux 64 位 (Ubuntu/Debian) 上编译和运行它们中的每一个。前两个是在 linux 上编译和运行的,并没有真正使用任何外部库。第三个仅使用 Boost 1.50.0,并且没有使用与前两个相同的方法进行编译。因此,首先让我回顾一下我为使前两个工作发挥作用所做的工作。

  1. 我只从无数文件夹中提取了源代码。
  2. 我将 Windows 特定代码移植到 Linux 特定代码。
  3. 我编写了一个 bash 脚本来生成带有所有源代码的 g++ 命令来编译它们。
  4. 我运行了编译脚本以生成输出目标文件。

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

我正在使用的 boost 包括如下。

#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 文档的指示使用 boost 的本地源下载作为我的 g++ 命令的一部分,而不是预构建的二进制文件,因为我没有使用任何需要预构建的二进制文件。

2) 我意识到我构建事物的方式非常原始。我正在学习 make,我看到了一些使用 cmake 和 kdevelop 的建议,我需要研究一下。使用 make 的主要问题是这些项目在编写时并没有考虑到 make 所以我不知道源文件之间的依赖关系图来创建 makefile(如果我没想错的话;我对它)。如果您有任何关于如何做得更好的建议,请赐教。

谢谢。

最佳答案

我终于设法克服了这个问题,在这里我将简要说明如何解决。需要明确的是,我不知道原始问题的根本原因是什么。换句话说 - 我不知道为什么会出现问题。我要说的是,我的解决方法使我能够解决问题并解决其他问题(编译时错误)。

本质上,重申一下,问题是无论出于何种原因,使用 boost 的项目都没有在 Linux 上编译,因为使用 BOOST_PP_CAT() 函数的所有实例都会产生以下错误。

error: unterminated argument list invoking macro "BOOST_PP_CAT_I"

无论出于何种原因,编译器无法正确处理此函数的使用,但能够处理其他 boost 函数的使用,例如 BOOST_PP_LPAREN()、BOOST_PP_RPAREN() 和 BOOST_PP_COMMA。这个问题看起来几乎肯定与预处理阶段有关,在预处理阶段结合使用上述 boost 函数会导致未终止的参数列表。

为了详细说明相关代码的性质(谢天谢地,这不是我写的),之前的开发人员基本上使用 boost 预处理器函数来创建 DSL,然后他们可以多次重复使用它来生成函数列表。直接编写函数对我来说似乎容易得多,但无论如何这是另一个问题。

我的解决方法是更改​​代码的相关部分,使其不使用任何 BOOST_PP_CAT() 函数,但最终定义了与以前完全相同的函数。我通过将 BOOST_PP_CAT() 的使用替换为它生成的代码来做到这一点。这克服了上面引用的所有错误实例,但在我将此项目从 Windows 迁移到 Linux 的过程中给我留下了数百个其他编译时错误。

虽然这是一个非常具体和不寻常的问题,有一个同样具体和不寻常的答案,但我想反馈这个问题以揭开这个问题背后的谜团。至于为什么这个特定的函数在 linux 上无法预处理/编译但在 Windows 上传递我不知道但非常想知道。我只能假设这是 VC++ 执行预处理的方式与 g++ 和 clang 不同的根本区别,或者更具体地说,可能是预处理器指令中嵌套函数的解析顺序不同。谁知道。不管怎样,谢谢你们的帮助。

关于c++ - 使用 Boost 的 Visual Studio C++/OpenCL 项目未在 Linux 上使用 g++ 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com