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

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

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


当前回答

注意,在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变量,或者使用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项目的方法如下:

/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.

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

从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 

如果使用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参数仅用于多个配置生成器。