将Linux上的静态Intel IPP库与g ++链接的问题

时间:2009-02-03 18:59:49

标签: c++ linux linker g++

我一直在尝试将项目从Xcode转移到Linux(现在是Ubuntu x86,但希望静态链接的可执行文件可以在x86 CentOS机器上运行?我希望我希望?)。我有整个项目编译,但它在链接阶段失败 - 它为我提供了由IPP定义的所有函数的未定义引用。这可能是一件非常小而且愚蠢的事情,但是我已经在这几天打过头了,我无法让它发挥作用。

这是编译语句(我还有一个生成相同错误的makefile):

  

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   工具/源/ 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依赖项,它构建,链接和运行没有问题:“-lippiemerged”, “-lippimerged” “-lippsemerged” “-lippsmerged” “-lippcore”,

谢谢!

2 个答案:

答案 0 :(得分:1)

我在将代码与ipp的v 6链接时遇到了问题;使用v11版本的编译器(包含ipp的更新)神秘地修复了它们。当然,这是一个Windows平台,但我得到8u版本的函数进行编译,没有32f版本,尽管两者都在文档中被列为有效。

答案 1 :(得分:1)

您的链接问题可能是由于您的链接行完全向后:归档库应该在命令行上跟踪源文件和目标文件,而不是在它们之前。要了解订单的重要性,请阅读this

另请注意,在Linux上,静态链接的可执行文件的可移植性远低于动态链接的可执行文件。通常,如果您在较旧的Linux系统上动态链接系统库,它将适用于所有较新的系统(我使用古老的RedHat 6.2,而我没有看到我的可执行文件无法运行的系统)。对于完全静态的可执行文件,情况并非如此;当移动到具有与它们链接的libc不同的libc的系统时,它们可能以各种“有趣”的方式崩溃。