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

时间:2011-09-05 06:45:08

标签: visual-studio cmake startup visual-studio-project

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

解决方案中的启动项目始终为ALL_BUILD。如何通过CMake将启动项目更改为我想要的实际项目?

6 个答案:

答案 0 :(得分:88)

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解决方案的启动项目。

答案 1 :(得分:19)

你做不到。启动项目存储在二进制文件中,该文件不是由CMake生成的。如果没有该二进制文件,visual studio将默认为解决方案文件中的第一个项目,并且ALL_BUILD项目始终是第一个......

更新:这个答案是“过时的”,因为现在可以使用CMake 3.6。请参阅the answer by ComicSansMS

答案 2 :(得分:15)

从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's 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)

可用示例here

答案 3 :(得分:6)

如果你不能允许像我这样的perl依赖,我只是为Windows编写了一个名为 slnStartupProject 的小命令行实用程序来解决这个问题。它会自动设置启动项目:

slnStartupProject slnFilename projectName

在使用cmake生成解决方案之后,我个人使用它来设置项目,该解决方案始终将虚拟 ALL_BUILD 项目设置为解决方案中的第一个项目。

源代码在github上:

https://github.com/michaKFromParis/slnStartupProject

欢迎福克斯和反馈。

希望这有帮助!

答案 4 :(得分:1)

用户在点击"设置为启动项目"时做出的明确选择是正确的。在IDE中存储在二进制文件中。但是我在其他地方找到了Visual Studio在第一次打开解决方案时将解决方案中的第一个Project作为隐式启动项目,因此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机器上编写和测试)

答案 5 :(得分:-1)

使用cmake 3.5,可以使用

更改启动项目(适用于VS 2010)
SET(CMAKE_DEFAULT_STARTUP_PROJECT myFavoriteProject)

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