如何通过CMake更改Visual Studio解决方案的启动项目?

72

我正在使用CMake生成Visual Studio项目,除了一件事,其他都很好。

解决方案中的启动项目总是ALL_BUILD。如何通过CMake将启动项目更改为我想要的真正项目?

6个回答

140

现在CMake通过版本3.6及更高版本的VS_STARTUP_PROJECT目录属性来支持此功能:

cmake_minimum_required(VERSION 3.6)
project(foo)
# ...

add_executable(bar ${BAR_SOURCES})
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT bar)

这将把bar设置为foo.sln解决方案的启动项目。


这在我的 Visual Studio 2019 上刚刚起作用了,非常感谢! - comrad
遗憾的是,这不能让我设置“当前选择”的选项。 - user1050755

21

你无法做到。启动项目存储在二进制文件中,这个文件不是由CMake生成的。如果没有这个二进制文件,Visual Studio会默认使用解决方案文件中的第一个项目,而ALL_BUILD项目总是第一个...

更新:此答案已经“过时”,因为使用CMake 3.6现在可以实现。请参见ComicSansMS的答案


5
在Visual Studio中,一旦项目已经创建,您可以使用上下文菜单命令“设置为启动项目”作为解决方法。 - sakra
11
请注意,CMake在版本3.6中终于引入了对此的支持。有关详细信息,请参见我的答案 - ComicSansMS
1
太好了,谢谢你的更新。我一定会使用它。 - André

16
自从Visual 2005以来,配置存储在名为projectname.vc(x)proj.user的纯xml文件中。
我不清楚是否有更改启动项目的方法,但你肯定可以将ALL_BUILD设置为运行所需的可执行文件,而不是显示愚蠢的弹出窗口:
create_default_target_launcher(
    your_desired_target_name
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/desired_path/"
    # or ${CMAKE_CURRENT_BINARY_DIR}, depending on your setup
)

这个模块可以在rpavlik的github上找到。你只需要在你的最顶层CMakeLists.txt文件中添加下面的内容:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/external/rpavlik-cmake-modules-1c73e35") # or whichever path you put the module in.
include(CreateLaunchers)

这里提供的示例


7
如果你不能允许像我这样的 Perl 依赖,我刚刚为 Windows 写了一个小型命令行实用程序,叫做slnStartupProject,以解决此问题。它会自动设置启动项目,就像这样:
slnStartupProject slnFilename projectName

我个人使用它在使用cmake生成解决方案后设置项目,它总是将虚拟的ALL_BUILD项目设置为解决方案中的第一个项目。
源代码在Github上:

https://github.com/michaKFromParis/slnStartupProject

欢迎使用分支和反馈。
希望这有所帮助!

1
当用户在IDE中点击“设置为启动项目”时所做的明确选择是存储在二进制文件中的。但我在其他地方发现,Visual Studio在首次打开解决方案时将第一个项目作为隐式启动项目,因此CMake对此有影响。
我们现在的问题是:ALL_BUILD始终是第一个项目。为了改变这一点,我在CMake之后运行了一个简短的perl脚本,将所需的项目定义从文件中剪切出来并粘贴到前面。解决方案文件的路径在第一个参数中,项目名称在第二个参数中。
use strict;
use File::Spec;

# variables
my $slnPath = File::Spec->rel2abs($ARGV[0]);
my $projectName = $ARGV[1];
my $contents;
my $header;
my $project;
my $GUID = "[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}";
my $fh;

# read file content (error if not found)
print "Setting \"$projectName\" as Startup Project in \"$slnPath\"...\n";
die "Error: path \"$slnPath\" not found!\n" if not -f $slnPath;
open($fh, "<", $slnPath) or die "Error: cannot read $slnPath: $!";
$contents = do { local $/; <$fh> };
close($fh) or warn "close failed: $!";

# extract part before Projects definition section (the first mention of "Project([GUID])")
$header = $1 if $contents =~ s{(.*?(?=Project\("\{${GUID}\}"\)))}{}si;

# extract definition of the project specified (error if not found)
$project = $1 if $contents =~ s{(Project\("\{${GUID}\}"\) = \"${projectName}\".*?EndProject\s)}{}si;
die "Error: Project not found!\n" if not defined $project or not length $project;

# write header, project definition and remaining content back into the file
`attrib -R "$slnPath"`;
open($fh, ">", $slnPath) or die "Error: cannot write to $slnPath: $!";
print $fh $header, $project, $contents;
close($fh) or warn "close failed: $!";

print "Successfully done.\n";

一旦打开解决方案,隐式启动项目将被保存在二进制文件中,因此变得显式,即使重新运行CMake(例如由ZERO-CHECK触发,不允许后执行),这个显式的启动项目也会得以保存。同样,显式用户选择也会被保留。(在安装有ActiveState Perl的Win7机器上编写并测试)

-3

使用cmake 3.5,可以通过以下方式更改启动项目(适用于VS 2010)

SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

在项目的主要CMakeLists.txt文件中。 默认情况下,它设置为ALL_BUILD。

你能提供关于这个命令的文档吗?并且它与@ComicSansMS所解释的VS_STARTUP_PROJECT指令有何不同? - tresf
很遗憾,我无法找出如何使用cmake 3.5在VS2010中运行该命令。现在,我使用VS_STARTUP_PROJECT属性来处理VS 2010/2015解决方案。 - mtartar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接