gpt4 book ai didi

c++ - CMake:CMAKE_REQUIRED_LIBRARIES 中的库顺序,用于在配置时测试最小程序

转载 作者:行者123 更新时间:2023-12-04 14:49:32 27 4
gpt4 key购买 nike

我写了这段小代码来确保我的软件在必要时链接到 libatomic。通常仅在 Raspberry Pi 上需要链接到 libatomic。目前,我正在使用带有 Raspbian Bullseye 64 位的 Raspberry Pi 4。

这是 cmake 代码:

set(ATOMIC32_TEST_CODE "
#include <atomic>
#include <stdint.h>
int main() {
std::atomic<int32_t> x;
x.store(1);
x--;
return x.load();
}")

set(ATOMIC64_TEST_CODE "
#include <atomic>
#include <stdint.h>
int main() {
std::atomic<int64_t> x;
x.store(1);
x--;
return x.load();
}")

macro(ATOMIC_CHECK)

# test whether atomic works
check_cxx_source_compiles("${ATOMIC32_TEST_CODE}" atomic32_test)
check_cxx_source_compiles("${ATOMIC64_TEST_CODE}" atomic64_test)

# if doesn't work, attempt to find the atomic library, link with it and try again
if(NOT atomic32_test OR NOT atomic64_test)
find_library(ATOMIC NAMES libatomic.so.1
HINTS
$ENV{HOME}/local/lib64
$ENV{HOME}/local/lib
/usr/local/lib64
/usr/local/lib
/opt/local/lib64
/opt/local/lib
/usr/lib64
/usr/lib
/lib64
/lib
/usr/lib/arm-linux-gnueabihf
)

if(ATOMIC)
set(LIBATOMIC ${ATOMIC})
message(STATUS "Found libatomic: ${LIBATOMIC}")
message(STATUS "Attempting to test atomic with atomic library linked")

get_filename_component(atomic_lib_dir ${LIBATOMIC} DIRECTORY)

# Before setting CMAKE_REQUIRED_FLAGS, we preserve the current state
cmake_push_check_state()

set(CMAKE_REQUIRED_LIBRARIES "-L${atomic_lib_dir} -latomic")
check_cxx_source_compiles("${ATOMIC32_TEST_CODE}" atomic32_test_with_atomic_linking)
check_cxx_source_compiles("${ATOMIC64_TEST_CODE}" atomic64_test_with_atomic_linking)

cmake_pop_check_state()

if(NOT atomic32_test_with_atomic_linking)
message(FATAL_ERROR "Even after linking with the atomic library, atomic 32-bit compilation failed.")
endif()

if(NOT atomic64_test_with_atomic_linking)
message(FATAL_ERROR "Even after linking with the atomic library, atomic 64-bit compilation failed.")
endif()

set(ATOMIC_LINKER_LIBS "-L${atomic_lib_dir} -latomic")
else()
message(FATAL_ERROR "Failed to find libatomic even though it seems to be required")
endif()
endif()

endmacro()

ATOMIC_CHECK()

这段代码的作用如下:

  1. 尝试编译代码的 32 位和 64 位版本,并确保它们在退出时返回 0。
  2. 如果其中任何一个编译不通过,则查找 libatomic,如果未找到,则报错。
  3. 如果找到,尝试链接到它并再次编译相同的小源
  4. 如果他们成功了,太好了,我们将使用新发现的库作为编译其他所有内容的基础。如果不是,cmake 配置将停止。

最近我的 Pi 开始突然出现链接错误。所以我调查了一下,这让我找到了this problem .在 CMakeError.log 中,我看到了这个链接错误:

/usr/bin/c++ -Wall -Wextra -Wno-unused-variable -Wno-unused-function -Wno-unused-private-field -Wno-class-memacces>
/usr/bin/ld: CMakeFiles/cmTC_7285b.dir/src.cxx.o: in function `main':
src.cxx:(.text+0x40): undefined reference to `__atomic_store_8'
/usr/bin/ld: src.cxx:(.text+0x80): undefined reference to `__atomic_load_8'
/usr/bin/ld: CMakeFiles/cmTC_7285b.dir/src.cxx.o: in function `std::__atomic_base<long long>::operator--(int)':
src.cxx:(.text._ZNSt13__atomic_baseIxEmmEi[_ZNSt13__atomic_baseIxEmmEi]+0x40): undefined reference to `__atomic_fetch_s>
collect2: error: ld returned 1 exit status

最后,我认为唯一的问题是链接顺序。 cmake 要做的就是让它工作,就是将 -latomic 放在它试图编译的源文件之后。

我如何告诉 cmake 将链接命令放在源文件之后,而不是之前?

最佳答案

正如有人在别处指出的那样,改变

set(CMAKE_REQUIRED_LIBRARIES "-L${atomic_lib_dir} -latomic")

到:

set(CMAKE_REQUIRED_LIBRARIES "-L${atomic_lib_dir}" "-latomic")

解决了这个问题。 CMake 显然可以识别前缀。

关于c++ - CMake:CMAKE_REQUIRED_LIBRARIES 中的库顺序,用于在配置时测试最小程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69281559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com