- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个库 QPhiX,我想用一个大型应用程序 Chroma 对其进行编译。这两个库都有其他依赖项,这是一个相当复杂的东西,大约有一百万行。 QPhiX 已编译干净,我已将其安装到 ~/local-jureca
中。
在编译 Chroma 的过程中,Intel C++ version 17 编译器给我这样的错误:
../../lib/libchroma.a(syssolver_mdagm_aggregate.o): In function `QPhiX::CommsUtils::sumDouble(double*)':
syssolver_mdagm_aggregate.cc:(.text+0x180): multiple definition of `QPhiX::CommsUtils::sumDouble(double*)'
../../lib/libchroma.a(syssolver_linop_aggregate.o):syssolver_linop_aggregate.cc:(.text+0x1d0): first defined here
编译器调用是这样的,我已经手工分解了长行。一些标志被复制,因为 configure
获取所用库的标志并将它们分解到 CXXFLAGS
中。
/usr/local/software/jureca/Stages/2016b/software/impi/2017.0.098-iccifort-2017.0.098-GCC-5.4.0/bin64/mpiicpc \
-I/homec/hbn28/hbn28e/Sources/chroma/mainprogs/main \
-I/homec/hbn28/hbn28e/Sources/chroma/lib \
-I../../lib \
-O2 \
-Wall \
-fopenmp \
--std=c++11 \
-I/homec/hbn28/hbn28e/local-jureca/include \
-I/homec/hbn28/hbn28e/local-jureca/include/libxml2 \
-I/usr/local/software/jureca/Stages/2016b/software/GMP/6.1.1-iccifort-2017.0.098-GCC-5.4.0/include \
-O2 \
-Wall \
-fopenmp \
-I/homec/hbn28/hbn28e/local-jureca/include \
-O2 \
-Wall \
-fopenmp \
-L../../lib \
-L/homec/hbn28/hbn28e/local-jureca/lib \
-L/usr/local/software/jureca/Stages/2016b/software/GMP/6.1.1-iccifort-2017.0.098-GCC-5.4.0/lib \
-L/homec/hbn28/hbn28e/local-jureca/lib \
-L../../other_libs/qdp-lapack/lib
-o cfgtransf \
cfgtransf.o \
-lchroma \
-lqdp \
-lXPathReader \
-lxmlWriter \
-lqio \
-llime \
-L/homec/hbn28/hbn28e/local-jureca/lib \
-lxml2 \
-lm \
-lqmp \
-lqmp \
-lintrin \
-lfiledb \
-lfilehash \
-lgmp \
-lqphix_solver \
-lqdp-lapack
我查看了函数 QPhiX::CommsUtils::sumDouble(double*)
的定义位置。在 Chroma 中,没有一次使用此功能。因此,错误在 QPhiX 中,但没有人注意到,因为那里没有文件包含头文件 qphix/include/qphix/comm.h
。精简后,这个文件在这里:
namespace QPhiX {
#ifndef QPHIX_DO_COMMS
namespace CommsUtils {
void sumDouble(double *d) {}
}
#else
// I see a multiple definition error of `sumDouble` when compiling Chroma. I
// suspect that somehow both flags are passed. Therefore check that only one of
// the mutually exclusive flags is given. Perhaps it would be even better to
// use a `#else` here.
#if defined(QPHIX_FAKE_COMMS) && defined(QPHIX_QMP_COMMS)
#error \
"You must specify QPHIX_FAKE_COMMS xor QPHIX_QMP_COMMS when specifying QPHIX_DO_COMMS."
#endif
#ifdef QPHIX_FAKE_COMMS
namespace CommsUtils {
void sumDouble(double *d) {}
};
#endif // QPHIX_FAKE_COMMS
#ifdef QPHIX_QMP_COMMS
namespace CommsUtils {
void sumDouble(double *d) { QMP_sum_double(d); };
};
#endif // QPHIX_QMP_COMMS
#endif // ifndef QPHIX_DO_COMMS
}; // Namespace
预处理器分支看起来只能在这个文件中激活一个定义。如果构建系统同时提供了 QPHIX_FAKE_COMMS
和 QPHIX_QMP_COMMS
,则应该激活 #error
。
这两条错误消息都是在 libchroma.a
中引起的,这一定是编译 Chroma 的中间构建步骤。这两个定义在不同的目标文件中(syssolver_mdagm_aggregate.o
和 syssolver_linop_aggregate.o
),但是匹配的 C++ 源文件都不包含函数定义,它们都只包含 QPhiX header 文件。那里定义了函数 sumDouble
。
这里发生了什么? sumDouble
的两个定义是否会成为一个问题,即使这两种情况下的三个变体相同?或者这是否意味着两个 Chroma 源文件包含设置了不同预处理器标志的 qphix/include/qphix/comm.h
?
我该如何解决这个问题?只是让 QPhiX 中所有有问题的函数显式内联
?他们似乎只委托(delegate)给 QDP++ 库,所以内联就好了。
也许我运气不好,QPhiX 和 Chroma 的 devel
分支不能一起工作,但是 master
也不能工作。所以我再次想知道我做错了什么,假设开发这个软件的人可以很好地编译它。
最佳答案
如果在头文件中定义函数,需要在头文件中加上inline。
否则如果多个文件包含它,当链接器尝试链接时,它会发现存在多个定义并报告多个定义错误(如果有内联,链接器将选择其中一个)。
关于c++ - 诊断多重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40912355/
当我在一台机器上启动我的应用程序时,它立即退出说它已经“停止工作”。在事件日志中,我看到 MissingMethodException 是原因。没有显示异常对话框,并且在事件日志详细信息中我看不到任何
我正在从 Windows Phone 8 模拟器调用 Azure 移动服务。有时我会收到没有 InnerException 属性的 MobileServiceInvalidOperationExcep
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
知道为什么我的应用程序被杀死吗?我是该节点的唯一用户。 我的历史记录服务器也没有显示任何内容。我如何进一步追踪并了解是谁杀死了它,以及为什么以及如何修复它? ubuntu@anmol-vm1-new:
我正在创建一个 Web 客户端,用于使用 ACS Calling SDK 加入 Teams session 。我在加载诊断 API 时遇到问题。 Microsoft 提供了此页面: https://l
我正在寻找一种从 Windows Azure 中的性能计数器获取原始数据的方法 使用诊断 API。 到目前为止,我注意到我可以从已知的计数器中配置一个计数器 并设置该计数器的采样率。 诊断配置中配置的
我在将 WebRole(WCF 服务)部署到 Azure 时遇到问题。我的 WebRole 持续显示忙碌状态至少 30 分钟,直到我中止它。我通过 Visual Studio 2010 进行部署。我正
Clang has several kinds of diagnostics ,其中三种主要是错误、警告和注释。 注释通常伴随着某些警告和错误,例如重复定义: error: conflicting t
调试由于 Win32 生产过程中的死锁而导致的明显挂起的步骤和技术是什么。我听说 WinDbg 可用于此目的,但您能否提供有关如何实现此目的的明确提示? 最佳答案 此 post应该让您开始使用各种选项
我有一个在 Azure 上运行的应用程序,它会记录(实际上是跟踪)到 Azure 诊断存储。我正在寻找一个可以用来分析这些日志的好工具。 我知道可以使用 Visual Studio 中的服务器资源管理
我在当前项目中使用 Bazel 经历了很长的“干净构建”时间。 我们推荐的诊断步骤是什么? 最佳答案 尝试使用 --profile 分析您的构建 语法为 bazel build --profile f
我在解释 gcc (4.8.2) 警告和错误时遇到问题。更准确地说,很难分辨一个问题在哪里结束,另一个问题从哪里开始。我只能通过控制台访问构建机器,因此不能选择使用 IDE。 我真的需要能够快速区分个
我想为我的 azure 云服务启用 azure 诊断,但我有点困惑。 我读了这篇文章:https://learn.microsoft.com/en-us/azure/cloud-services/cl
我想我这里有个卷曲的地方...我有一个WinForms应用程序,当它作为x64进程运行时,它每小时大约会定期崩溃。我怀疑这是由于堆栈损坏引起的,并且想知道是否有人看到过类似的问题,或者是否有诊断和检测
我正在研究 Azure Web 角色的性能改进,并想知道在发布/部署到生产站点时是否应保留诊断。 This article说要禁用它,但其中一条评论说您会丢失关键数据。 最佳答案 您绝对应该启用它。一
我的解决方案中有多个 Web 和辅助角色,但我还有一个在 Azure 托管 VM 上运行的非 Azure 应用程序。该应用程序连接到 Azure 存储以执行各种操作,例如读取和写入 blob 和队列,
我仍在努力理清思路 Azure Service Fabric Stateful Actors 。因此,我的(当前)问题最好放入这样的示例中: 我有一个帮助台系统,其中每张票证都是一个有状态的参与者。参
CUDA 到处都有大量文档和指南,但我找不到任何形式的说明来指导如何诊断编译但收到神秘、模糊错误消息(例如“未指定启动”)的内核“这些 block /网格结构有意义吗?”等等 我可以以某种方式拦截cu
我没有找到太多解决 azure 事件网格中事件丢失场景的方法。 因此我提出与以下场景相关的问题: 我们的代码将事件发布到域。 事件将传送到订阅中配置的网络 Hook 。 这在一段时间内有效。 消费者(
这个问题有点宽泛,但我觉得没有一个地方可以帮助系统地诊断 Elasticsearch 问题。广泛的类别可能是: 客户 查询错误 查询结果不正确 无法解释的行为 服务器 设置问题 性能问题 严重错误 无
我是一名优秀的程序员,十分优秀!