我做cmake . && make all install
。这有效,但会安装到/usr/local
。
我需要安装到不同的前缀(例如,/usr
)。
要安装到cmake
而不是make
的{{1}}和/usr
命令行是什么?
答案 0 :(得分:398)
您可以在命令行上传入任何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) ),被别人忽视。
答案 1 :(得分:36)
":路径"可以省略接受答案中的部分内容。这种语法可能更令人难忘:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
...用于答案here。
答案 2 :(得分:23)
请注意,在CMake和Autotools中,您并不总是必须在配置时设置安装路径。您可以在安装时使用DESTDIR(另请参阅here),如下所示:
make DESTDIR=<installhere> install
另见this question,它解释了DESTDIR和PREFIX之间的细微差别。
这适用于分阶段安装,并允许将程序存储在与其运行位置不同的位置,例如/etc/alternatives
通过符号链接。
但是,如果您的包是可重定位的,并且不需要通过配置阶段设置的任何硬编码(前缀)路径,则可能可以跳过它。 所以而不是:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
你会跑:
cmake . && make DESTDIR=/usr all install
请注意,正如user7498341指出的那样,这不适合您真正应该使用PREFIX的情况。
答案 3 :(得分:13)
我跨平台构建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
./project-root/build/stage
中 - 如果路径不是绝对的,则始终将该路径视为当前目录).
中配置的项目,其中构建系统在之前的行中配置。它将执行install
目标,如果需要构建它们,它还会构建所有必需的依赖目标,然后将文件复制到CMAKE_INSTALL_PREFIX
(在本例中为./project-root/build/stage
。配置构建,如在Visual Studio中,您还可以使用可选的--config <config>
标志指定配置。cmake --build
命令的好处是它适用于所有生成器(即makefile和Visual Studio),而不需要不同的命令。之后我使用已安装的文件创建包或将它们包含在其他项目中......
答案 4 :(得分:4)
关于布鲁斯亚当斯回答:
你的回答会造成危险的混乱。 DESTDIR适用于 安装在根树之外。它允许人们看到会是什么 如果没有指定DESTDIR,则安装在根树中。 PREFIX是实际安装所在的基本目录 基于
例如,PREFIX = / usr / local表示 final 目的地 一个包是/ usr / local。使用DESTDIR = $ HOME将安装文件 好像$ HOME是根(/)。如果说DESTDIR是/ tmp / destdir,那么 可以看到安装&#39;会影响。本着这种精神,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, prog.db永远不会被找到,因为它不在预期的位置。
最后,/ etc / alternatives确实不能这样工作。有 符号链接到根树中安装的程序(例如vi - &gt; / usr / bin / nvi, vi - &gt; / usr / bin / vim等。)。
答案 5 :(得分:4)
答案 6 :(得分:2)
如果使用 CMake ,则调用实际生成器(例如通过make
)被认为是不好的做法。强烈建议这样做:
配置阶段:
cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
构建和安装阶段
cmake --build _builds/foo/debug --config Debug --target install
当采用这种方法时,可以轻松切换生成器(例如-GNinja
Ninja ),而不必记住任何特定于发生器的命令。