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

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

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


你可以在命令行中传入任何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)使用,其他人会忽略它。


可省略已接受答案中的“:PATH”部分。下面的语法可能更容易记住:

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

...和这里的答案一样。


注意,在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的情况。


我跨平台构建CMake项目的方法如下:

/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
/project-root/build> cmake --build . --target=install --config=Release

The first two lines create the out-of-source build directory The third line generates the build system specifying where to put the installation result (which I always place in ./project-root/build/stage - the path is always considered relative to the current directory if it is not absolute) The fourth line builds the project configured in . with the buildsystem configured in the line before. It will execute the install target which also builds all necessary dependent targets if they need to be built and then copies the files into the CMAKE_INSTALL_PREFIX (which in this case is ./project-root/build/stage. For multi-configuration builds, like in Visual Studio, you can also specify the configuration with the optional --config <config> flag. The good part when using the cmake --build command is that it works for all generators (i.e. makefiles and Visual Studio) without needing different commands.

之后,我使用安装的文件来创建包或将它们包含在其他项目中…


关于布鲁斯·亚当斯的回答:

你的回答会造成危险的混乱。DESTDIR用于 从根树中安装。它能让人看到未来的样子 如果没有指定DESTDIR,则安装在根树中。 PREFIX是实际安装所在的基本目录 的基础。

例如,PREFIX=/usr/local表示最终目的地址 包的/usr/local。使用DESTDIR=$HOME将安装这些文件 就好像$HOME是根目录(/)。如果DESTDIR为/tmp/ DESTDIR,则为1 可以看看'make install'会产生什么影响。本着这种精神,DESTDIR 不应该影响构建的对象。

一个makefile片段解释它:

install:
    cp program $DESTDIR$PREFIX/bin/program

程序必须假定PREFIX是final的基目录 (即生产)目录。符号链接程序的可能性 安装在DESTDIR=/something只意味着程序没有 基于PREFIX访问文件,因为它根本不能工作。猫(1) 是一个(以最简单的形式)可以在任何地方运行的程序。 下面是一个不会的例子:

prog.pseudo.in:
    open("@prefix@/share/prog.db")
    ...

prog:
    sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
    compile prog.pseudo

install:
    cp prog $DESTDIR$PREFIX/bin/prog
    cp prog.db $DESTDIR$PREFIX/share/prog.db

如果你试图从$PREFIX/bin/prog以外的地方运行prog, program .db永远不会被找到,因为它不在预期的位置。

最后,/etc/alternatives实际上不是这样工作的。有 安装在根树中的程序的符号链接(例如vi -> /usr/bin/nvi, Vi -> /usr/bin/vim等)。


如果使用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 3.15开始,实现这一点的正确方法是使用:

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

官方文档


从CMake 3.21开始,你可以使用——install-prefix选项,而不是手动设置CMAKE_INSTALL_PREFIX。

现代版的configure——prefix=DIR && make all install现在是:

cmake -B build --install-prefix=DIR
cmake --build build
cmake --install build

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

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

在配置期间

两个选择:

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