cmake 如果我使用-ipo标志,OneAPI的链接器问题

q8l4jmvw  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(153)

我正在使用oneAPI(英特尔的编译器),在编译时使用-ipo标志时遇到了问题。设置:

  • my_lib项目:静态库
  • my_test:链接到my_lib的可执行文件

文件:my_lib

  • main.cpp
int foo() {
    return 0;    
}
  • CMakeLists
project(my_lib CXX)
add_library(my_lib STATIC main.cpp)

my_test

  • main.cpp
#include <iostream>

using namespace std;
int main() {
    cout << "Hello World" << endl;
}
  • CMakeLists
project(my_test)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ipo")

add_subdirectory(my_lib)

add_executable(my_test main.cpp)
target_link_libraries(my_test my_lib)

文件夹结构如下所示:

  • main.cpp
  • CMakeLists. txt//这是my_test
  • 我的库(_L)
  • main.cpp
  • CMakeLists.txt

我会在my_test的CMakeLists.txt上运行cmake,然后运行make。我得到的错误是:

...
...
[100%] Linking CXX executable my_test
/usr/bin/ld: my_lib/my_lib.a: error adding symbols: archive has no index; run ranlib to add one
icpx: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/my_test.dir/build.make:98: my_test] Error 1
make[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/my_test.dir/all] Error 2

你知道为什么我不能把这个简单的代码链接起来吗?

s8vozzvw

s8vozzvw1#

看起来你在英特尔社区筹集了一个thread
在CMakeLists.txt中进行以下更改后,您可以尝试使用CMake进行构建。此命令可用于通过icpx编译器启用IPO。

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ipo")  
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)

请参阅下面的链接了解更多信息。
https://gitlab.kitware.com/cmake/cmake/-/issues/20818

wn9m85ua

wn9m85ua2#

我在某个地方读到,默认的GNU链接器无法理解使用Intel编译器构建的带有-ipo标志的二进制文件。我切换到使用LLVM链接器,它工作了。
为了打开它,我将以下内容添加到CMakeLists文件中

add_link_options("-fuse-ld=lld")

相关问题