我做cmake。&&全部安装。这可以工作,但是会安装到/usr/local。
我需要安装到不同的前缀(例如,到/usr)。
安装到/usr而不是/usr/local的cmake和make命令行是什么?
我做cmake。&&全部安装。这可以工作,但是会安装到/usr/local。
我需要安装到不同的前缀(例如,到/usr)。
安装到/usr而不是/usr/local的cmake和make命令行是什么?
当前回答
从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项目的方法如下:
/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变量,或者使用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
关于布鲁斯·亚当斯的回答:
你的回答会造成危险的混乱。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等)。