2

我一直在尝试将项目从 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 工具/include -o main main.cpp pick_peak.cpp get_starting_segments.cpp get_segment_timing_differences.cpp recast_and_normalize_wave_file.cpp pitch_score.cpp pitch_score.cpp pitch_curve.cpp tools/source/LocalBuffer.cpp工具/来源/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”、

谢谢!

4

2 回答 2

1

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

于 2009-02-03T19:17:57.637 回答
1

您的链接问题可能是由于您的链接行完全向后:存档库应该在命令行上遵循源文件和目标文件,而不是在它们之前。要了解顺序为何重要,请阅读内容。

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

于 2009-02-07T05:22:51.233 回答