Пытаюсь включить библиотеку в c , но не могу. Я новичок в c , так что, вероятно, какая-то очень простая ошибка

#c #include

Вопрос:

Я пытаюсь включить библиотеку c для целых чисел неограниченного размера. С веб-страницы кажется, что это очень хорошая целочисленная библиотека неограниченного размера для c , которую я смог найти. Я не могу успешно скомпилировать свой код. Я новичок в c , поэтому, вероятно, я совершаю какую-то очень простую ошибку, пожалуйста, объясните мне эту ошибку. Или эта библиотека сама по себе не работает? Я пытаюсь включить эту библиотеку, но получаю ошибки: с кодом:

 #include <cbignum/Cbignum.h>
#include <cbignum/Cbignumf.h>
#include <cbignum/Exarray.h>
int main(){
    cBigNumber a=cBigNumber(10);
    return 0;}
 

Я получаю ошибки:

 /usr/bin/ld: CMakeFiles/suurte_taisrvude_proovid.dir/main.cpp.o: in function `cBigNumber::create(long long)':
[PATH1]/cbignum/Cbignum.h:104: undefined reference to `cBigNumber::_stub'
/usr/bin/ld: [PATH1]/cbignum/Cbignum.h:107: undefined reference to `exmalloc'
/usr/bin/ld: CMakeFiles/[PATH2]/main.cpp.o: in function `cBigNumber::~cBigNumber()':
[PATH1]/cbignum/Cbignum.h:128: undefined reference to `exfree'
/usr/bin/ld: CMakeFiles/[PATH2]/main.cpp.o: in function `exblock<long long>::confine(unsigned long)':
[PATH1]/cbignum/Exarray.h:585: undefined reference to `excalcblocksize'
/usr/bin/ld: CMakeFiles/[PATH2]/main.cpp.o: in function `exblock<long long>::range() const':
[PATH1]/cbignum/Exarray.h:559: undefined reference to `exrange'
/usr/bin/ld: CMakeFiles/[PATH2]/main.cpp.o: in function `exblock<long long>::reallocate(unsigned long, unsigned long)':
[PATH1]/cbignum/Exarray.h:515: undefined reference to `exnull_c'
/usr/bin/ld: [PATH1]/cbignum/Exarray.h:516: undefined reference to `exrange'
/usr/bin/ld: [PATH1]/cbignum/Exarray.h:539: undefined reference to `exaligned_mrealloc'
collect2: error: ld returned 1 exit status
 

из этого сообщения на форуме у меня появилась идея добавить Cbignum.cpp, Cbignumf.cpp, и Exarray.cpp , но с этим кодом:

 #include <cbignum/Cbignum.h>
#include <cbignum/Cbignumf.h>
#include <cbignum/Exarray.h>
#include <cbignum/Cbignum.cpp>
#include <cbignum/Cbignumf.cpp>
#include <cbignum/Exarray.cpp>
int main(){
    cBigNumber a=cBigNumber(10);
    return 0;}
 

Я получаю ошибки:

 In file included from [PATH1]/cbignum/Cbignumf.cpp:20,
                 from [PATH3]/main.cpp:45:
[PATH1]/cbignum/Cbignumf.inl: In function ‘void cBigNumberInfo(exptr<long long int>)’:
[PATH1]/cbignum/Cbignumf.inl:145:35: error: ambiguous overload for ‘operator<<’ (operand types are ‘cTTY’ and ‘long long int’)
  145 |     cBigNumberMessages << "... (" << (CBNL)(n1 * sizeof (CBNL)) << " bytes)n";
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                        |             |
      |                        cTTY          long long int
In file included from [PATH1]/cbignum/Cbignum.h:31,
                 from [PATH3]/main.cpp:41:
[PATH1]/cbignum/Ctty.h:143:14: note: candidate: ‘cTTYamp; operator<<(cTTYamp;, long int)’
  143 | inline cTTYamp; operator << (cTTYamp; os, long num)
      |              ^~~~~~~~
[PATH1]/cbignum/Ctty.h:148:14: note: candidate: ‘cTTYamp; operator<<(cTTYamp;, int)’
  148 | inline cTTYamp; operator << (cTTYamp; os, int num)
      |              ^~~~~~~~
[PATH1]/cbignum/Ctty.h:153:14: note: candidate: ‘cTTYamp; operator<<(cTTYamp;, short int)’
  153 | inline cTTYamp; operator << (cTTYamp; os, short num)
      |              ^~~~~~~~
[PATH1]/cbignum/Ctty.h:158:14: note: candidate: ‘cTTYamp; operator<<(cTTYamp;, char)’
  158 | inline cTTYamp; operator << (cTTYamp; os, char c)
      |              ^~~~~~~~
In file included from [PATH3]/main.cpp:44:
[PATH1]/cbignum/Cbignum.cpp:1479:7: note: candidate: ‘cTTYamp; operator<<(cTTYamp;, const cBigNumberamp;)’
 1479 | cTTYamp; operator << (cTTYamp; os, const cBigNumberamp; b)
      |       ^~~~~~~~
In file included from [PATH3]/main.cpp:46:
[PATH1]/cbignum/Exarray.cpp: At global scope:
[PATH1]/cbignum/Exarray.cpp:193:17: error: redefinition of ‘size_t exmuladd(size_t, size_t, size_t)’
  193 | size_t  FCDECL  exmuladd (size_t s, size_t n, size_t k)
      |                 ^~~~~~~~
In file included from [PATH1]/cbignum/Cbignum.h:35,
                 from [PATH3]/main.cpp:41:
[PATH1]/cbignum/Exarray.h:228:15: note: ‘size_t exmuladd(size_t, size_t, size_t)’ previously defined here
  228 | inline size_t exmuladd (size_t s, size_t n, size_t k)
      |               ^~~~~~~~
In file included from [PATH3]/main.cpp:46:
[PATH1]/cbignum/Exarray.cpp:198:17: error: redefinition of ‘size_t exmul(size_t, size_t)’
  198 | size_t  FCDECL  exmul (size_t s, size_t n)
      |                 ^~~~~
In file included from [PATH1]/cbignum/Cbignum.h:35,
                 from [PATH3]/main.cpp:41:
[PATH1]/cbignum/Exarray.h:233:15: note: ‘size_t exmul(size_t, size_t)’ previously defined here
  233 | inline size_t exmul (size_t s, size_t n)
      |               ^~~~~
In file included from [PATH3]/main.cpp:46:
[PATH1]/cbignum/Exarray.cpp:203:17: error: redefinition of ‘size_t exadd(size_t, size_t)’
  203 | size_t  FCDECL  exadd (size_t n, size_t k)
      |                 ^~~~~
In file included from [PATH1]/cbignum/Cbignum.h:35,
                 from [PATH3]/main.cpp:41:
[PATH1]/cbignum/Exarray.h:238:15: note: ‘size_t exadd(size_t, size_t)’ previously defined here
  238 | inline size_t exadd (size_t n, size_t k)
      |               ^~~~~
In file included from [PATH3]/main.cpp:46:
[PATH1]/cbignum/Exarray.cpp:208:17: error: redefinition of ‘size_t exchkadd(size_t, size_t, size_t)’
  208 | size_t  FCDECL  exchkadd (size_t n, size_t k, size_t max)
      |                 ^~~~~~~~
In file included from [PATH1]/cbignum/Cbignum.h:35,
                 from [PATH3]/main.cpp:41:
[PATH1]/cbignum/Exarray.h:243:15: note: ‘size_t exchkadd(size_t, size_t, size_t)’ previously defined here
  243 | inline size_t exchkadd (size_t n, size_t k, size_t max)
      |               ^~~~~~~~
make[3]: *** [CMakeFiles/[PATH2]/build.make:82: CMakeFiles/[PATH2]/main.cpp.o] Error 1
make[2]: *** [CMakeFiles/Makefile2:95: CMakeFiles/[PATH2]/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/[PATH2]/rule] Error 2
 

Определение CBNL:

 #ifndef CBNL
#ifdef  __cplusplus
#if     __cplusplus >= 201103L
#warning "newer standard: long long"
#define CBNL long long
#define CBNL_MIN    LLONG_MIN
#define CBNL_MAX    LLONG_MAX
#define UCBNL_MAX   ULLONG_MAX
#include "Cbnl.inl"
#endif
#endif
#endif

#ifndef CBNL
#warning "older standard: long"
#define CBNL long
#define CBNL_MIN    LONG_MIN
#define CBNL_MAX    LONG_MAX
#define UCBNL_MAX   ULONG_MAX
#include "Cbnl.inl"
#endif
 

Комментарии:

1. .cpp файлы не должны быть #include -d. Предполагается, что они должны быть скомпилированы отдельно, и компоновщик связывает скомпилированный код вместе для создания окончательной программы.

2. @PaulMcKenzie, Смогу ли я использовать эту библиотеку, если скомпилирую их отдельно, или это просто проблема стиля?

3. Вы знакомы с тем, как создать многомодульную программу на C ? Предполагается, что вы создадите каждый исходный файл отдельно, а затем попросите компоновщика связать все скомпилированные исходные файлы. Используемая вами среда разработки (если вы ее используете) сделает это, если вы укажете файлы в проекте. Если вы компилируете в командной строке, то параметры командной строки будут использоваться для компиляции нескольких файлов и их связывания.

4. Я использую Клион.

5. Обычно библиотека состоит не из одного исходного файла, а из нескольких исходных файлов, некоторые из которых обеспечивают зависимости для функций библиотеки.