当我使用 gcc 时,如何使用由 Intel 编译器编译的库?

Posted

技术标签:

【中文标题】当我使用 gcc 时,如何使用由 Intel 编译器编译的库?【英文标题】:How can I use libraries which were compiled by Intel compiler, when I'm using gcc? 【发布时间】:2015-08-02 13:31:31 【问题描述】:

我在 Linux 上运行,我有一个由英特尔编译器编译的库 (.a)。

我正在尝试链接这个静态库(我正在使用 g++)并收到链接错误:

undefined reference to intel_fast_memcpy

我请求将该库作为共享库 (.so) 获取,该库也是由英特尔编译器编译的,但我得到了同样的错误。

当我使用 gcc 时,如何使用英特尔编译器编译的库?

【问题讨论】:

@HighPerformanceMark:这是否意味着对象兼容性?据我了解,它仅与 GCC-source 兼容(至少对于 C++),这意味着能够解释 GCC-makros software.intel.com/en-us/node/512816 在英特尔 C++ 15.0 编译器手册中的“GCC* 兼容性和互操作性”software.intel.com/en-us/node/522750 部分中,HighPerformanceMark 暗示,它具有链接使用 gcc 和 icc 编译的程序的说明。我浏览了一下,寻找一个明确的声明,说名称修改是相同的。我没有发现,但鉴于它引用的一些库,我认为这是一个安全的假设。 【参考方案1】:

据我所知,没有办法将 C++ 客户端代码与使用不同编译器构建的 C++ 库链接起来(即使是相同的编译器名称但不同的版本也不起作用)。 C++ -linkage 未标准化。

但是,C-linkage 是。如果您包装一个库以将符号导出为 C,(外部“C” - 代码中的块)您可以将这些库与任何编译器一起使用,甚至不仅可以与 C/C++ 一起使用;为此,在您的情况下,应该使用 intel-compiler 构建 wrapper-lib。

【讨论】:

谢谢。所以我会要求将库作为 c 库。我需要请求用特殊标志编译它吗? 我对英特尔编译器不熟悉。告诉提供商您的 gcc 版本和平台,他们应该知道该怎么做。但是,使用 C 库肯定不如 C++ 舒服。您将需要创建者/析构函数而不是 c-tors、d-tors,并通过句柄(例如整数或名称)管理在 C++ 库中创建的对象。如果应用程序很大,我最好考虑切换到相同的编译器。 我尝试使用静态 c lib (.a) 但同样的错误

以上是关于当我使用 gcc 时,如何使用由 Intel 编译器编译的库?的主要内容,如果未能解决你的问题,请参考以下文章

内联 intel 语法到内联 gcc

C语言编译器icc与gcc编译出来的执行文件有啥区别?

如何在命令行中使用intel c++编译器,并使用openmp和mkl来编译自己的程序,并运算

如何安装icc编译器

如何使用 gcc 生成可以用 nasm 编译的汇编代码 [重复]

如何关闭 gcc 编译器优化以启用缓冲区溢出