- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先是一些背景知识——我有三个 VS2010 C++/OpenCL 项目,它们可以在 Windows 7 64 位上正常编译和运行。我一直在尝试在 Linux 64 位 (Ubuntu/Debian) 上编译和运行它们中的每一个。前两个是在 linux 上编译和运行的,并没有真正使用任何外部库。第三个仅使用 Boost 1.50.0,并且没有使用与前两个相同的方法进行编译。因此,首先让我回顾一下我为使前两个工作发挥作用所做的工作。
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/
我经常使用 SSMS 查询数据和构建数据集,我的 IT 部门负责数据库管理。 最近我发现了 Azure Data Studio,我喜欢: 智能感知 源代码控制(例如使用 Git) 来自社区的扩展 SQ
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
我们的开发团队计划从 visual studio 2005 升级到 visual studio 2010 -- 跳过 visual studio 2008。 大部分项目是VB ASP.NET项目,使用
我的Visual Studio 2015无法构建2010平台工具集。它说: The build tools for Visual Studio 2010 (v100) cannot be found.
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
这个问题在这里已经有了答案: Can Visual Studio Code and VS 2012 be installed on same computer? (1 个回答) 关闭去年。 在安装了
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
我想开始编程 CUDA。 我已经安装了 Visual Studio 2010 Express。 我还安装了 nVidia nSight Visual Studio。 而且我具备所有常见的先决条件(Ne
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我有一个我一直在开发的应用程序,但在 android studio 上遇到了问题。当我点击“build->run”然后选择我的设备时,应用程序永远不会在我的手机上运行(并且自动出现的android-s
我正在使用Visual Studio2010。我面临的一个问题是,当我创建一个新的Web项目时,Visual Studio将创建该项目,并且不会在解决方案资源管理器中显示其解决方案。 另一件事是,我想
我通读了这里的许多帖子,却找不到一个有效的明确答案。因此,在花了一些时间使它生效之后,我认为应该发布它。 问题:发布配置文件将建立在服务器上,但不会发布。 解: 确保已安装Microsoft Wind
我正在尝试使用Visual Studio 2012构建针对.NET 3.5的C++ CLI应用程序。 通过安装Visual Studio 2008,并指定v90平台工具集,我已经在一台机器上进行了这项
我在 Microsoft Visual Studios 2013 中有一个项目,我想在 Microsoft Visual Studios 2010 中打开它。有什么简单的方法吗?还是我必须在2010年
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
我一直在使用 Compass 编译 Windows 环境中的 sass 文件,无论是在命令行上还是使用 Compass-app 来查看目录。 我刚刚开始使用 Visual Studio(专业版 201
我是一名优秀的程序员,十分优秀!