gpt4 book ai didi

c++ - 如何使用 -v 调用查看有关 cmake 链接器错误( undefined symbol )的详细信息?

转载 作者:行者123 更新时间:2023-12-02 22:59:41 27 4
gpt4 key购买 nike

具体如何使用 -v 调用来查看有关 cmake 链接器错误的详细信息?我发现有关使用此选项的两个现有问题,一个是针对 Xcode 构建,另一个是针对 NDK 构建。他们在这里:

use -v to see invocation?

How to use cmake -v invocation to help find linker error

我使用的是 OSX Mojave。我使用标准的 cmakelists.txt 方法,错误是这样的:

Undefined symbols for architecture x86_64:
"Image::createImage(int, int, int)", referenced from:
_main in tutorial.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

SO问题中的评论显示了我正在尝试做的事情:

...you could use -v to see the linker invocation to see what's going wrong. It would show you this link line:

"/usr/bin/ld" -demangle -dynamic -arch x86_64
-macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o
/var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o
-lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a

(顺便说一句,我是一个 cmake 菜鸟)我已经在我的 cmakelists.txt 中尝试了以下所有操作,但它们不起作用:

add_link_options(-v)
add_link_options("-v")
target_link_options(myexec PUBLIC -v)
target_link_options(myexec PUBLIC "-v")
target_link_options(myexec PUBLIC "LINKER:-v")

最佳答案

最简单的是简单的 VERBOSE=1 make 而不仅仅是 make (如果您使用 make)。

输出是这样的:

VERBOSE=1 make      
[100%] Linking C executable example
/usr/bin/cmake -E cmake_link_script CMakeFiles/example.dir/link.txt --verbose=1
/usr/bin/cc -rdynamic CMakeFiles/example.dir/main.c.o -o example
make[2]: Leaving directory '../c-examples/cmake/build'
[100%] Built target example
make[1]: Leaving directory '../c-examples/cmake/build'
/usr/bin/cmake -E cmake_progress_start ../c-examples/cmake/build/CMakeFiles 0

您会看到这里调用了cc。就您而言,您使用的是 clang (也可能是 gcc)。

假设您已经执行了诸如 sudo update-alternatives --config cc 之类的操作 - 或在操作系统上组织符号链接(symbolic link)的任何其他方式 - 以获得 clang作为您的默认编译器。现在,如果您只需输入cc -v,您将看到它将显示版本信息。您宁愿要求链接器更加详细。这是通过 -Wl-Xlinker 完成的。

就您而言,类似 CMakeLists.txt 的内容将提供充足的信息:

# Note that this is an older cmake version, use target_link_options if available
cmake_minimum_required (VERSION 2.6)

# Project name (in this case a simple C project where the math dep is "forgotten")
project(mathdep_example)

# Not your situation, but in case you have a different linker
# set(CMAKE_EXE_LINKER_FLAGS "-Wl,--verbose")

# Clang passes flags through to the linker (likely ld) by
# set(CMAKE_EXE_LINKER_FLAGS "-Xlinker -v")

# Clang passing flags to the linker (likely ld) AND using -v itself to show how it calls the linker
set(CMAKE_EXE_LINKER_FLAGS "-Xlinker -v -v")

# The final executable
add_executable(example main.c)

# In case you want also verbose compilation steps
target_compile_options(example PRIVATE -v)

观察 -v 在链接器标志中出现两次。第一个前面带有 -Xlinker 的内容将被传递给链接器(可能是 ld)。第二个是在链接器步骤中 clang 本身的选项。请注意,即使您确实这样做了,clang 仍然会告诉您添加 -v。这可能被认为是一个错误...

就您而言,我会检查您使用的 .o.a 文件类型。听起来它们不适合您的架构。使用文件:

file object_file.o
file archive_file.a

关于c++ - 如何使用 -v 调用查看有关 cmake 链接器错误( undefined symbol )的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58268965/

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