Ссылка c и c ++ объектные файлы

0

Я получаю ошибку компоновщика, когда пытаюсь связать файл c++ и c object. Он не может разрешить символы в объектном файле c.

Здесь мой консольный вывод:

Undefined symbols for architecture x86_64:
  "PF_OpenFile(char*)", referenced from:
      snapshot::processItem(workItem) in snapshot.o
      raid01::raid01(int) in raid01.o
      raid01::execute_workItem(workItem) in raid01.o
  "PF_AllocPage(int, int*, char**)", referenced from:
      snapshot::processItem(workItem) in snapshot.o
      raid01::raid01(int) in raid01.o
  "PF_CloseFile(int)", referenced from:
      snapshot::processItem(workItem) in snapshot.o
      raid01::raid01(int) in raid01.o
      raid01::execute_workItem(workItem) in raid01.o
  "PF_UnfixPage(int, int, int)", referenced from:
      snapshot::processItem(workItem) in snapshot.o
      raid01::raid01(int) in raid01.o
      raid01::execute_workItem(workItem) in raid01.o
  "PF_CreateFile(char*)", referenced from:
      snapshot::snapshot(char*) in snapshot.o
      raid01::raid01(int) in raid01.o
  "PF_GetThisPage(int, int, char**)", referenced from:
      snapshot::processItem(workItem) in snapshot.o
      raid01::execute_workItem(workItem) in raid01.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Здесь вывод nm в объектном файле c:

0000000000001730 s EH_frame0
0000000000001226 s L_.str
0000000000001242 s L_.str1
00000000000012a8 s L_.str10
00000000000012c5 s L_.str11
00000000000012ed s L_.str12
00000000000012f8 s L_.str13
000000000000131a s L_.str14
000000000000133b s L_.str15
000000000000135f s L_.str16
0000000000001384 s L_.str17
0000000000001398 s L_.str18
00000000000013aa s L_.str19
000000000000125d s L_.str2
00000000000013ba s L_.str20
00000000000013d2 s L_.str21
00000000000013de s L_.str22
00000000000013f0 s L_.str23
0000000000001405 s L_.str24
0000000000001430 s L_.str25
000000000000144b s L_.str26
000000000000127a s L_.str3
000000000000127d s L_.str4
0000000000001281 s L_.str5
0000000000001283 s L_.str6
0000000000001285 s L_.str7
000000000000128e s L_.str8
0000000000001298 s L_.str9
0000000000000c70 T _PF_AllocPage
0000000000001928 S _PF_AllocPage.eh
00000000000006a0 T _PF_CloseFile
0000000000001888 S _PF_CloseFile.eh
0000000000000260 T _PF_CreateFile
00000000000017c0 S _PF_CreateFile.eh
0000000000000370 T _PF_DestroyFile
00000000000017e8 S _PF_DestroyFile.eh
0000000000000e90 T _PF_DisposePage
0000000000001950 S _PF_DisposePage.eh
00000000000008e0 T _PF_GetFirstPage
00000000000018b0 S _PF_GetFirstPage.eh
0000000000000920 T _PF_GetNextPage
00000000000018d8 S _PF_GetNextPage.eh
0000000000000ae0 T _PF_GetThisPage
0000000000001900 S _PF_GetThisPage.eh
0000000000000200 T _PF_Init
0000000000001798 S _PF_Init.eh
0000000000000490 T _PF_OpenFile
0000000000001838 S _PF_OpenFile.eh
0000000000001120 T _PF_PrintError
00000000000019a0 S _PF_PrintError.eh
0000000000001050 T _PF_UnfixPage
0000000000001978 S _PF_UnfixPage.eh
                 U _PFbufAlloc
                 U _PFbufGet
                 U _PFbufReleaseFile
                 U _PFbufUnfix
                 U _PFbufUsed
00000000000019f0 S _PFerrno
0000000000001470 d _PFerrormsg
0000000000001a00 b _PFftab
00000000000011c0 t _PFftabFindFree
00000000000019c8 s _PFftabFindFree.eh
                 U _PFhashInit
0000000000000000 T _PFreadfcn
0000000000001748 S _PFreadfcn.eh
00000000000003f0 t _PFtabFindFname
0000000000001810 s _PFtabFindFname.eh
0000000000000100 T _PFwritefcn
0000000000001770 S _PFwritefcn.eh
                 U ___stderrp
                 U _close
                 U _exit
                 U _fprintf
                 U _free
                 U _lseek
                 U _malloc
                 U _open
                 U _perror
                 U _printf
                 U _read
0000000000000650 t _savestr
0000000000001860 s _savestr.eh
                 U _strcmp
                 U _strcpy
                 U _strlen
                 U _unlink
                 U _write

Почему соответствующие символы имеют префикс _? Это то, что вызывает проблему?

Кроме того, файл C был скомпилирован с -x c в g++ (не знаю, если это актуально).

Теги:
object-files

1 ответ

0
Лучший ответ

Похоже, вам нужно сделать процедуру C++ совместимой с C-связью. См.: Источник C++, каков эффект extern "C"?

  • 0
    Куда я это положил? В заголовке файла C, где объявлены функции PF_ *, или в источнике C ++, где я вызываю функции?
  • 0
    @Roshan Есть пара ответов на вопрос, который я связал выше. Один из них подробно описывает, как разместить объявление в ваших исходных файлах.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню