Clion中的多重定义错误

时间:2018-02-12 10:36:51

标签: c compiler-errors c-preprocessor

我添加了#34; Mersenne Twist Pseudorandom Number Generator Package" (一个头文件和一个源文件)到我的Clion C项目,但我无法构建项目。 错误是:

multiple definition of `mts_lrand'

我可以使用命令行和gcc成功编译和运行程序,但在Clion我不能。

我认为它与宏有关,但我不知道如何解决它。

这是我添加的代码的一部分:

mtwist.h

.
.
.
.
/*
 * In gcc, inline functions must be declared extern or they'll produce
 * assembly code (and thus linking errors).  We have to work around
 * that difficulty with the MT_EXTERN define.
 */
#ifndef MT_EXTERN
#ifdef __cplusplus
#define MT_EXTERN           /* C++ doesn't need static */
#else /* __cplusplus */
#define MT_EXTERN   extern      /* C (at least gcc) needs extern */
#endif /* __cplusplus */
#endif /* MT_EXTERN */
/*
 * Make it possible for mtwist.c to disable the inline keyword.  We
 * use our own keyword so that we don't interfere with inlining in
 * C/C++ header files, above.
 */
#ifndef MT_INLINE
#define MT_INLINE   inline      /* Compiler has inlining */
#endif /* MT_INLINE */
/*
 * Try to guess whether the compiler is one (like gcc) that requires
 * inline code to be available in the header file, or a smarter one
 * that gets inlines directly from object files.  But if we've been
 * given the information, trust it.
 */
#ifndef MT_GENERATE_CODE_IN_HEADER
#ifdef __GNUC__
#define MT_GENERATE_CODE_IN_HEADER 1
#endif /* __GNUC__ */
#if defined(__INTEL_COMPILER)  ||  defined(_MSC_VER)
#define MT_GENERATE_CODE_IN_HEADER 0
#endif /* __INTEL_COMPILER || _MSC_VER */
#endif /* MT_GENERATE_CODE_IN_HEADER */
#if MT_GENERATE_CODE_IN_HEADER
/*
 * Generate a random number in the range 0 to 2^32-1, inclusive, working
 * from a given state vector.
 *
 * The generator is optimized for speed.  The primary optimization is that
 * the pseudorandom numbers are generated in batches of MT_STATE_SIZE.  This
 * saves the cost of a modulus operation in the critical path.
 */
MT_EXTERN MT_INLINE uint32_t mts_lrand(
    register mt_state*  state)      /* State for the PRNG */
    {
    register uint32_t   random_value;   /* Pseudorandom value generated */
    if (state->stateptr <= 0)
    mts_refresh(state);
    random_value = state->statevec[--state->stateptr];
    MT_PRE_TEMPER(random_value);
    return MT_FINAL_TEMPER(random_value);
    }
.
.
.
.

你看到函数定义在头文件中,我认为这是问题,但我不知道该怎么做

您可以看到完整的代码here

0 个答案:

没有答案