我做cmake。&&全部安装。这可以工作,但是会安装到/usr/local。

我需要安装到不同的前缀(例如,到/usr)。

安装到/usr而不是/usr/local的cmake和make命令行是什么?


当前回答

如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是坏习惯。强烈建议这样做:

配置+生成阶段: cmake -S foo -B _builds/foo/debug -G "Unix Makefiles" -D CMAKE_BUILD_TYPE:STRING= debug -D CMAKE_DEBUG_POSTFIX:STRING=d -D CMAKE_INSTALL_PREFIX:PATH=/usr 构建和安装阶段: cmake——build _builds/foo/debug——config debug——目标安装

当采用这种方法时,生成器可以轻松切换(例如-G Ninja代表Ninja),而无需记住任何特定于生成器的命令。

请注意,CMAKE_BUILD_TYPE变量仅用于单个配置生成器,而build命令的——config参数仅用于多个配置生成器。

其他回答

你可以在命令行中传入任何CMake变量,或者使用ccmake/ CMake -gui编辑缓存的变量。在命令行中,

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install

将配置项目,构建所有目标并安装到/usr前缀。类型(PATH)不是严格必要的,但是会导致基于Qt的cmake-gui显示目录选择器对话框。

作为注释的一些小补充清楚地表明,提供简单的等价对某些人来说是不够的。最佳实践是使用外部构建目录,即不是直接使用源代码。还可以使用更通用的CMake语法抽象生成器。

mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. && cmake --build . --target install --config Release

你可以看到它变得相当长,不再是直接等价的,但更接近于一个相当简洁的形式的最佳实践……——config只被多配置生成器(即MSVC)使用,其他人会忽略它。

有很多答案,但我想我应该做一个总结来正确地分组并解释它们的区别。

首先,您可以通过以下两种方式之一定义前缀:在配置期间,或者在安装时,这实际上取决于您的需要。

在配置期间

两个选择:

cmake -S $src_dir -B $build_dir -D CMAKE_INSTALL_PREFIX=$install_dir
cmake -S $src_dir -B $build_dir --install-prefix=$install_dir # Since CMake 3.21

在安装期间

优点:如果你想改变它,不需要重新配置。

两个选择:

cmake DESTDIR=$install_dir --build $build_dir --target=install # Makefile only
cmake --install $build_dir --prefix=$install_dir 

从CMake 3.15开始,实现这一点的正确方法是使用:

cmake --install <dir> --prefix "/usr"

官方文档

如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是坏习惯。强烈建议这样做:

配置+生成阶段: cmake -S foo -B _builds/foo/debug -G "Unix Makefiles" -D CMAKE_BUILD_TYPE:STRING= debug -D CMAKE_DEBUG_POSTFIX:STRING=d -D CMAKE_INSTALL_PREFIX:PATH=/usr 构建和安装阶段: cmake——build _builds/foo/debug——config debug——目标安装

当采用这种方法时,生成器可以轻松切换(例如-G Ninja代表Ninja),而无需记住任何特定于生成器的命令。

请注意,CMAKE_BUILD_TYPE变量仅用于单个配置生成器,而build命令的——config参数仅用于多个配置生成器。

注意,在CMake和Autotools中,你并不总是需要在配置时设置安装路径。你可以在安装时使用DESTDIR(参见这里),如下所示:

make DESTDIR=<installhere> install

另请参阅这个问题,它解释了DESTDIR和PREFIX之间的微妙差异。

这用于分期安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接存储在/etc/alternatives中。

然而,如果你的包是可重定位的,并且不需要通过配置阶段设置任何硬编码(前缀)路径,你可以跳过它。 所以不要:

cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install

你会跑:

cmake . && make DESTDIR=/usr all install

注意,正如user7498341所指出的,这不适用于真正应该使用PREFIX的情况。