CMake 库目标并不总是出现在 Visual Studio 2017 的启动项下拉列表中

Posted

技术标签:

【中文标题】CMake 库目标并不总是出现在 Visual Studio 2017 的启动项下拉列表中【英文标题】:CMake library targets don't always appear in Visual Studio 2017's Startup Item dropdown 【发布时间】:2017-08-25 14:15:56 【问题描述】:

我目前正在开发一个 CMake C++ 项目,使用 Visual Studios 对 CMake 的全新内置支持: https://blogs.msdn.microsoft.com/vcblog/2016/10/05/cmake-support-in-visual-studio/

我的“根”CMakeLists.txt 文件设置了一些变量,然后包含了一些子目录:

project("MyProject")
cmake_minimum_required(VERSION 3.4.3)
set (CMAKE_CXX_STANDARD 14)

include_directories(projecta/include)
include_directories(projectb/include)
include_directories(projectc/include)

# Dump the DEBUG and RELEASE outputs next to the program
# that will use the DLL
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "$CMAKE_CURRENT_LIST_DIR/../lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "$CMAKE_CURRENT_LIST_DIR/../lib")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "$CMAKE_CURRENT_LIST_DIR/../dll")

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "$CMAKE_CURRENT_LIST_DIR/../lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "$CMAKE_CURRENT_LIST_DIR/../lib")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "$CMAKE_CURRENT_LIST_DIR/../dll")

add_subdirectory(projecta)
add_subdirectory(projectb)
add_subdirectory(projectc)

projectaprojectbprojectc 子目录包含简单的 CMakeLists.txt 文件,如下所示:

set(LIB_NAME "projectc")
set(LIB_DEPENDENCIES "projecta" "projectb")

include_directories(include)

FILE(GLOB_RECURSE SOURCE_CPP_FILES "src/*.cpp")
FILE(GLOB_RECURSE SOURCE_C_FILES "src/*.c")
FILE(GLOB_RECURSE HEADER_FILES "include/"$LIB_NAME"/*.h")

add_library($LIB_NAME $PLT_LIBRARY_MODE $SOURCE_CPP_FILES $SOURCE_C_FILES $HEADER_FILES)
target_link_libraries($LIB_NAME $LIB_DEPENDENCIES)

我从开发者控制台打开项目:

devenv <the directory containing the top CMakeLists.txt file>

我的问题:add_libraries 定义的共享库不会在“选择启动项”下显示为目标,这会阻止我在目标的 .cpp 文件之一中使用 F7 进行编译。

在“选择启动项”下选择“当前文档”无效 - F7 或 Ctrl-Shift-B 不起作用。我不确定提供此功能的规则是什么。 我以前曾看到过这样的 DLL,但我无法确定我的其他 CMakeLists.txt 文件中的不同之处(我不再拥有它们) 如果我使用 add_subdirectory 包含第三方库的 CMakeLists.txt,其 .exe 目标将出现在“选择启动项”下,我可以对其使用 F7。 如果我右键单击顶层 CMakeLists.txt 文件,我可以看到“Build”下的所有 DLL、LIB 和 EXE 目标。这就是我现在的编译方式,但它不像捣碎 F7 那样令人满意;)

有人遇到过类似的问题吗?

【问题讨论】:

【参考方案1】:

看来我的环境/缓存可能已损坏。我删除了项目目录中自动生成的 .vs 文件夹并使用 devenv .,和以前一样。

我现在可以使用 F7 构建任何 cpp 文件。在 Select Startup Item 下仍然看不到任何 DLL 目标,但现在已经足够了。

编辑:或者,CMake/Cache/Generate/CMakeLists.txt 似乎也有帮助。

【讨论】:

并确保升级到 15.3 并包含更多与 CMake 相关的修复。 谢谢 - 这改变了很多行为。仍然希望我可以为 dll 目标定义一个默认构建(这样我就可以从任何地方混合 F7),但仍然没有成功。

以上是关于CMake 库目标并不总是出现在 Visual Studio 2017 的启动项下拉列表中的主要内容,如果未能解决你的问题,请参考以下文章

cmake - 支持 Visual Studio 过滤器

如何在 CMake 中隐藏某些目标?

为啥 JavaScript Intellisense 在 Visual Studio 2012 中并不总是有效?

用CMake设置Visual Studio工程中第三方库

CMake Project in Visual Studio 2019

CMake Project in Visual Studio 2019