2016-07-29 49 views
0

我正在使用arpackpp接口。整个库被写入.h文件中,因此不需要编译库。“多重定义...”在我当前的项目中使用arpackpp

/.../Files/Includes/:当我有一些arpackpp头文件中的一些我的文件,这是不是main.cpp,我得到了下面的错误 - 我现在面临的问题../../../arpack++/include/arerror.h:163:多重定义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/包括/../../../ ARPACK ++ /包含/ arerror.h:163:ArpackError::code' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In function的std ::矢量> :: MAX_SIZE()const的'的多个定义:

arpackpp链接所有.o文件时起作用。正如我在几个线程中看到的,问题是我实际上包含了函数的实例化,通常应该避免这些实例化。 因为我不想更改整个图书馆,所以我在main.cpp中使用arpackpp类包含所有类和函数,这些类变得非常混乱。有没有解决这个问题的方法?为什么不包括警卫(#ifndef...#endif)防止这个问题?

+0

你能否详细说明你的错误......“多重定义......”可能意味着很多事情?你可以通过编辑你的问题来做到这一点。 – silvergasp

回答

0

通常,使用仅标题库的最简单方法是仅使用标题扩展代码。如果您使用正确的标头警卫,这将消除您的代码的多个定义的问题。如果您有大量现有代码,那么我建议您将所有*.cpp文件重命名为*.hpp(C++头文件),然后添加合适的标头警卫。此外,处理此基础代码的一种便捷方式是创建一个附加头文件config.hpp并在该文件中包含所有其他头文件。然后在你的main.c中,包含config.hpp文件是一件简单的事情。

例如

// Config.hpp ------------------------------------------------= 
#include "example.hpp" 
#include "example1.hpp" 
#include "example2.hpp" 
// etc. 

// main.cpp --------------------------------------------------= 
#include "Config.hpp" 

int main() { 
    // Your code here. 
    return 0; 
} 

此外,如果你想与你的项目结构,以继续它会分离所有的代码到需要直接访问arpackcpp功能的一个简单的事情。然后将它们全部放入一个*.cpp文件中,并编译成*.o和链接。

+0

感谢您的回答。将我的文件更改为hpp确实有帮助。我唯一面临的\t不便之处在于我的make文件不会在我的* .hpp文件中识别出任何机会。 – dimmigen

+0

您的第二个建议对我无效。在包含config.hpp时,我收到了和以前一样的错误消息。你可以向我解释什么是仅包含config.hpp时的区别吗? – dimmigen

+0

@dimmigen假设你有许多只使用arpack库的函数。如果你把所有这些文件放在'some.c'文件中'#include“arpack”'只在'some.c'文件中,而不是在相应的'some.h'文件中。这基本上意味着你只使用基于头的函数一次。 – silvergasp

0

首先,包括警卫在这一点上没有帮助,因为他们只是防止项目文件依赖图的“子树”中包含多个头文件。换句话说:如果在同一项目的两个完全分离的文件中包含一个头文件,C++预处理程序将用标头中指定的代码两次取代#include <header.h>。只要头只包含声明,这就完全正常了。

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

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

+0

感谢您的回答。用arkcpp你的意思是arpackpp?或者这是不同的cpp库的名称?谷歌的一项快速调查并未涉及与该主题相关的任何内容。 – dimmigen

+0

对不起,只是一个错字。当然,我的意思是arpackpp :)。我会在我的回答中纠正错字。 –

相关问题