C++ 如何使用-v调用查看cmake链接器错误(未定义符号)的详细信息?

C++ 如何使用-v调用查看cmake链接器错误(未定义符号)的详细信息?,c++,macos,cmake,linker-errors,undefined-symbol,C++,Macos,Cmake,Linker Errors,Undefined Symbol,我如何具体使用-v调用来查看cmake链接器错误的详细信息?我发现关于使用这个选项存在两个问题,一个是关于Xcode构建,另一个是关于NDK构建。他们在这里: 我在OSX莫哈韦。我使用的是标准的cmakelists.txt方法,错误如下: Undefined symbols for architecture x86_64: "Image::createImage(int, int, int)", referenced from: _main in tutorial.cpp

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

我在OSX莫哈韦。我使用的是标准的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
,或者您在操作系统上组织符号链接的任何其他方式,以将
clang
作为默认编译器。现在,如果您只需键入
cc-v
,您将看到它将显示
version
信息。您宁愿要求链接器冗长。这是通过
-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
,即使您确实这样做了。这可能被认为是一个bug

在您的情况下,我会检查您使用的是哪种
.o
.a
文件。听起来它们不适合您的体系结构。使用
文件

file object_file.o
file archive_file.a

你有什么版本的CMAKE<代码>添加链接选项和
目标链接选项
已添加到CMAKE 3.13中。我正在使用CMAKE 3.15.3。是的,看来我一定是错误地使用了添加链接选项和目标链接选项。您是否尝试过添加链接选项(“链接器:-v”)?根据CMAKE文档(),如果您的CMAKE设置使用编译器(
gcc
/
clang
)来链接内容,您需要这样做。此外,我会检查是否缺少库、32位库或任何正在编译的32位库。尝试过,但输出与未尝试时完全相同。我使用的正是您推荐的。-v仅显示link命令,它不会使错误消息更清晰。很难猜测为什么它拒绝告诉您它找不到的符号,闻起来像是stderr重定向问题。或者我们需要查看link命令;)我会尽快试试这个。不幸的是,一个非常关键的问题需要我的关注。是的,这是一个ld问题,因此它不是编译器。因此,我将尝试您的-Wl或-Xlinker建议,并详细说明。我只是在您建议和构建的地方将以下行添加到我的cmakelists.txt文件中:set(CMAKE_EXE_LINKER_FLAGS“-Wl,--verbose”)。在结果中,这一行现在是新的:ld:unknown option:--verbose,而且这些行(原始链接错误信息)现在也丢失了:架构x86的未定义符号\u 64:“Image::createImage(int,int,int)”,引用自:tutorial.cpp.o ld:symbol(s)中的\u main架构x86的not found_64VERBOSE=1提供了有关编译过程的详细信息,但没有提供任何有关链接过程的附加信息。我想您已经将
Xlinker-v
添加到链接器标志中了吧?请注意,例如,
gcc
或其变体需要
-Wl
标志才能传递给链接器。在您的情况下,我认为您使用了
clang
,因此它应该是
Xlinker
。然后您可以将
-v
传递给链接器。只需将带有
VERBOSE=1 make的完整输出放入摘要中即可。并且还返回
文件*.o
文件*.a
的结果。你很快就会得到帮助的!