我一直在试图将一个项目从Xcode移到Linux(现在是Ubuntu x86,但是希望静态链接的可执行文件可以在x86 CentOS机器上运行?我希望我希望?)。 我有整个项目编译,但它在链接阶段失败 – 它给我所有由IPP定义的函数的未定义的引用。 这可能是一个非常小而愚蠢的事情,但是现在我已经打了几天头了,而我却无法完成它的工作。
这里是编译语句(我也有一个生成相同的错误的生成文件):
g ++ -static /opt/intel/ipp/6.0.1.071/ia32/lib/libippiemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippimerged.a /opt/intel/ipp/6.0.1.071/ ia32 / lib / libippsemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippsmerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippcore.a -pthread -I / opt / intel / ipp / 6.0.1.071 / ia32 / include -I tools / include -o main main.cpp pick_peak.cpp get_starting_segments.cpp get_segment_timing_differences.cpp recast_and_normalize_wave_file.cpp rhythm_score.cpp pitch_score.cpp pitch_curve.cpp tools / source / LocalBuffer.cpp tools / source / wave.cpp distance.cpp
…这里是链接器错误的长列表的开始:
./main.o: In function `main': main.cpp:(.text+0x13f): undefined reference to `ippsMalloc_16s' main.cpp:(.text+0x166): undefined reference to `ippsMalloc_32f' main.cpp:(.text+0x213): undefined reference to `ippsMalloc_16s'
有任何想法吗? FWIW,这些是我的Xcode项目中的IPP依赖关系,它build立,链接和运行时没有问题:“-lippiemerged”,“-lippimerged”,“-lippsemerged”,“-lippsmerged”,“-lippcore”,
谢谢!
您的链接问题可能是由于您的链接线完全倒退:归档库应在命令行上遵循源文件和目标文件,而不是在它们之前。 要理解为什么顺序很重要,请阅读。
另请注意,在Linux上,静态链接的可执行文件比动态链接的可执行文件的可移植性要低得多 一般来说,如果你在一个较老的Linux系统上动态链接系统库,它将在所有较新的系统上工作(我使用古老的RedHat 6.2,而且我还没有看到一个系统,我的可执行文件将不能运行)。 对于完全静态的可执行文件,这不是真的; 当移动到与链接链接不同的libc的系统时,它们可能会以各种“有趣”的方式崩溃。
链接代码与ipp v 6有问题; 使用v11版本的编译器(包括更新到ipp)神秘地修复它们。 当然,这是一个Windows平台,但我得到的8u版本的函数编译和没有32f版本,尽管在文档中被列为有效。