链接和编译C库未定义的符号。在另一个文件中预声明以实现

链接和编译C库未定义的符号。在另一个文件中预声明以实现,c,makefile,linker,freeimage,C,Makefile,Linker,Freeimage,好的,我在编译和链接一个C库(来自Microsoft的LibJXR)时遇到了一些问题,它在一个文件中有预声明,在另一个文件中有实现。(为iOS构建FreeImage 3.16) 编译部分是成功的,但是链接并不多(不过我相信问题在于编译) 这就是我所知道的。我有一个名为“decode.c”的文件,它有一个名为adaptehighpassdec的函数的预声明,但是这是在另一个名为segdec.c的c文件中实现的 针对目标为i386(Xcode)的lib构建时的错误堆栈 所以我相信现在发生的事情是ad

好的,我在编译和链接一个C库(来自Microsoft的LibJXR)时遇到了一些问题,它在一个文件中有预声明,在另一个文件中有实现。(为iOS构建FreeImage 3.16)

编译部分是成功的,但是链接并不多(不过我相信问题在于编译)

这就是我所知道的。我有一个名为“decode.c”的文件,它有一个名为
adaptehighpassdec
的函数的预声明,但是这是在另一个名为
segdec.c
的c文件中实现的

针对目标为i386(Xcode)的lib构建时的错误堆栈

所以我相信现在发生的事情是
adaptehighpassdec
内置在
strdec.o-i386
对象中,所以当链接器说,哦,嘿,这里声明的
decode.o-i386
中没有
adaptehighpassdec
。我认为其他错误是相同的问题,但是功能不同

因此,如果不进行主要的源文件修改,有没有办法解决这个问题,比如将对象编译成一个?或者我应该把另一个c文件合并到主文件中,然后只编译这个文件

我正在使用makefile来构建库和一个自定义脚本,如果有帮助的话,我可以共享它

以下是第一个问题文件的C源文件:

功能是
AdaptHighpassDec
还是
\u AdaptHighpassDec
?因为这是两件不同的事情。C++在这里涉及到什么地方?这可能是
extern C
(或类似)问题吗?是的,该函数被称为
adaptehighpassdec
<代码>\u AdapterHighPassdec除了已编译的LIB之外,其他任何地方都不存在。我认为这只是出于某种内在原因而在它们前面加上前缀。这是与其他C++ LIBS同时编译的,但是这些文件的编译器绝对是<代码> CLAN<代码> > <代码> CLAN++<代码>。如果你是从C++文件/代码中包含这个C库的头文件,那么你需要在包含的C标题(或在其中)中有<代码> ExtCn/Cube >,以防止C++名称的篡改被破坏(从而破坏了找到C符号的能力)。
    Undefined symbols for architecture i386:
  "_AdaptHighpassDec", referenced from:
      _ResetCodingContextDec in freeimage.a(decode.o-i386)
  "_AdaptLowpassDec", referenced from:
      _ResetCodingContextDec in freeimage.a(decode.o-i386)
  "_DecodeMacroblockDC", referenced from:
      _processMacroblockDec in freeimage.a(strdec.o-i386)
      _WMPhotoTranscode in freeimage.a(JXRTranscode.o-i386)
  "_DecodeMacroblockHighpass", referenced from:
      _processMacroblockDec in freeimage.a(strdec.o-i386)
      _WMPhotoTranscode in freeimage.a(JXRTranscode.o-i386)
  "_DecodeMacroblockLowpass", referenced from:
      _processMacroblockDec in freeimage.a(strdec.o-i386)
      _WMPhotoTranscode in freeimage.a(JXRTranscode.o-i386)
ld: symbol(s) not found for architecture i386