【问题标题】:Cmake: target defined in a subdirectory doesnt link. I get undefined referenceCmake:在子目录中定义的目标没有链接。我得到未定义的参考
【发布时间】:2020-06-07 02:07:45
【问题描述】:

我不是一个实验过的 CMake 用户,我目前正在尝试将现有项目包含到顶级项目中,而顶级项目的 CMakelists.txt 非常简单:

cmake_minimum_required(VERSION 2.8)

project(A)

add_subdirectory(B)

作为在这一点上逐步测试的一个问题,我想看看项目 B 中定义的目标是否正在构建。 因此,从项目 A 的构建目录运行 make all 可以正确构建,但是某些不属于所有目标的目标无法从项目 A 构建目录构建,在该目录中我收到带有“未定义引用”的链接错误,而相同目标可以从项目 B 的构建目录成功构建。 有人可以解释一下问题可能是什么吗?

【问题讨论】:

  • "有人能解释一下问题可能是什么吗?" - 如果不查看项目B代码、错误信息等,就无法说出问题所在。见How to Ask。请注意,不是每个项目都可以在添加 add_subdirectory 时构建。

标签: cmake hyperlink target undefined-reference subproject


【解决方案1】:

添加子目录只会导致cmake 处理该子目录中的CMakeLists.txt 文件,它不会对您正在构建的目标施加任何依赖。

将这个过程想象成从您添加的所有 CMakeLists 文件中构建一组很棒的规则(对于它要转换到的任何构建系统)可能会有所帮助。

但是,这只会在生成的规则集中为所有单独的 CMakeLists 目标放置规则,以便您可以按名称构建这些目标。如果您选择在A 中构建一个您未说明 依赖于B 的目标(即使它可能实际上 依赖它),那么B不会被使用。

为此,您必须设置链接器依赖项,例如(取决于名称和 B 生成的内容,当然):

cmake_minimum_required(VERSION 2.8)
project(A)
add_subdirectory(B)
target_link_libraries(A B)

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 2010-10-19
    • 2017-10-13
    • 1970-01-01
    • 2015-09-14
    • 2016-01-29
    • 2019-07-24
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多