gpt4 book ai didi

c++ - "multiple definition of ..."使用arpackpp

转载 作者:行者123 更新时间:2023-12-03 12:50:15 25 4
gpt4 key购买 nike

在我当前的项目中,我正在使用 arpackpp 界面。整个库都写在.h文件中,因此不需要编译库。我现在面临的问题 - 当我在一些文件中包含一些 arpackpp 头文件(不是 main.cpp)时,我收到以下错误:

/.../Files/Includes/../../../arpack++/include/arerror.h:163: multiple definition of ArpackError::Set(ArpackError::ErrorCode, std::string const&)'
/.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here
/tmp/ccruWhMn.o: In function
std::iterator_traits::iterator_category std::__iterator_category(char* const&)': /.../Files/Includes/../../../arpack++/include/arerror.h:163: multiple definition of ArpackError::code'
/.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here
/tmp/ccruWhMn.o: In function
std::vector >::max_size() const':

链接所有 .o 文件时的多个 arpackpp 函数。正如我在多个线程中读到的那样,问题是我实际上包含了函数的实例化,这通常应该避免。因为我不想更改整个库,所以我在 main.cpp 中使用 arpackpp 类包含了所有类和函数,这变得非常困惑。这个问题有解决方法吗?为什么不包含守卫(#ifndef...#endif)来防止这个问题?

最佳答案

首先,包含防护此时没有帮助,因为它们只能防止在项目文件依赖关系图的“子树”中多次包含 header 。换句话说:如果您在同一项目的两个完全独立的文件中包含 header ,则 C++ 预处理器将替换 #include <header.h>两次并独立地由 header 中指定的代码进行。只要 header 仅包含声明,这就完全没问题。

在您的情况下(以及在许多其他仅包含 header 的库的情况下), header 中也提供了定义。因此不幸的是(据我所知),除了在项目中包含一次包含定义的文件之外,没有其他优雅的方法。 https://github.com/m-reuter/arpackpp/blob/master/include/README明确指出哪些文件包含定义。

但是,某些库提供预处理器宏来触发包含所提供的头文件的定义(例如 https://github.com/nothings/stb )。也许arpackpp提供了类似的机制。

关于c++ - "multiple definition of ..."使用arpackpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654550/

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