我做cmake . && make all install。这是可行的,但安装到/usr/local。我需要安装到不同的前缀(例如,安装到/usr)。要安装到/usr而不是/usr/local,cmake和make命令行是什么?
cmake . && make all install
/usr/local
/usr
cmake
make
c0vxltue1#
您可以在命令行中传入任何CMake变量,或者使用ccmake/cmake-gui编辑缓存的变量。
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install
将配置项目,构建所有目标并安装到/usr前缀。类型(PATH)不是严格必需的,但会导致基于Qt的cmake-gui显示目录选择器对话框。
mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. && cmake --build . --target install --config Release
您可以看到它变得相当长,并且不再是直接等效的,但以相当简洁的形式更接近于最佳实践... --config仅由多配置生成器(即MSVC)使用,其他生成器会忽略它。
bkkx9g8r2#
可接受答案中的“:PATH”部分可以省略。以下语法可能更容易记忆:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
...如答案here中所用。
mefy6pfw3#
请注意,在CMake和Autotools中,您不必总是在配置时设置安装路径。您可以在安装时使用DESTDIR(另请参阅here),如下所示:
DESTDIR
make DESTDIR=<installhere> install
另请参见this question,它解释了DESTDIR和PREFIX之间的细微差别。这适用于分阶段安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接存储在/etc/alternatives。然而,如果你的包是可重定位的,并且不需要任何通过configure阶段设置的硬编码(前缀)路径,你 * 可能 * 可以跳过它。
PREFIX
/etc/alternatives
您可以运行:
cmake . && make DESTDIR=/usr all install
请注意,正如user7498341所指出的,这并不适用于真正应该使用PREFIX的情况。
ttvkxqim4#
我跨平台构建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
--config <config>
cmake --build
之后我使用安装的文件来创建包或将它们包含在其他项目中...
ldioqlga5#
从CMake 3.15开始,实现这一点的正确方法是使用:
cmake --install <dir> --prefix "/usr"
正式文件
qij5mzcb6#
从CMake 3.21开始,您可以使用--install-prefix选项,而不是手动设置CMAKE_INSTALL_PREFIX。configure --prefix=DIR && make all install的现代等价物现在是:
--install-prefix
configure --prefix=DIR && make all install
cmake -B build --install-prefix=DIR cmake --build build cmake --install build
pgx2nnw87#
关于布鲁斯·亚当斯的回答:您的回答会造成危险的混淆。DESTDIR是为根目录树以外的安装而设计的。如果没有指定DESTDIR,它可以让用户看到根目录树中安装了什么。PREFIX是真实的安装所基于的基目录。例如,PREFIX=/usr/local表示软件包的最终目的地是/usr/local。使用DESTDIR=$HOME将安装文件,就好像$HOME是根目录(/)一样。如果DESTDIR是/tmp/destdir,就可以看到“make install”会产生什么影响。在这种精神下,DESTDIR应该永远不会影响已构建的对象。一个makefile文件段来解释它:
install: cp program $DESTDIR$PREFIX/bin/program
程序必须假设PREFIX是最终目录(即生产目录)的基目录。符号链接安装在DESTDIR=/something中的程序的可能性仅意味着程序不会访问基于PREFIX的文件,因为它根本无法工作。cat(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 -〉/usr/bin/nvi,vi -〉/usr/bin/vim,等等)。
nr9pn0ug8#
如果使用CMake,调用实际的构建系统(例如通过make命令)被认为是不好的做法。强烈建议这样做:1.配置+生成阶段:
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
1.构建和安装阶段:
cmake --build _builds/foo/debug --config Debug --target install
当遵循这种方法时,发生器可以很容易地切换(例如Ninja的-G Ninja),而不必记住任何发生器特定的命令。请注意,CMAKE_BUILD_TYPE变量仅由单配置生成器使用,而build命令的--config参数仅由多配置生成器使用。
-G Ninja
CMAKE_BUILD_TYPE
--config
kx7yvsdv9#
答案很多,但我想我会做一个总结,以适当地分组,并解释他们的差异。首先,您可以通过以下两种方式之一定义前缀:在配置期间或安装时,这实际上取决于您的需求。
两个选项:
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
9条答案
按热度按时间c0vxltue1#
您可以在命令行中传入任何CMake变量,或者使用ccmake/cmake-gui编辑缓存的变量。
将配置项目,构建所有目标并安装到/usr前缀。类型(PATH)不是严格必需的,但会导致基于Qt的cmake-gui显示目录选择器对话框。
您可以看到它变得相当长,并且不再是直接等效的,但以相当简洁的形式更接近于最佳实践... --config仅由多配置生成器(即MSVC)使用,其他生成器会忽略它。
bkkx9g8r2#
可接受答案中的“:PATH”部分可以省略。以下语法可能更容易记忆:
...如答案here中所用。
mefy6pfw3#
请注意,在CMake和Autotools中,您不必总是在配置时设置安装路径。您可以在安装时使用
DESTDIR
(另请参阅here),如下所示:另请参见this question,它解释了
DESTDIR
和PREFIX
之间的细微差别。这适用于分阶段安装,并允许将程序存储在与运行位置不同的位置,例如通过符号链接存储在
/etc/alternatives
。然而,如果你的包是可重定位的,并且不需要任何通过configure阶段设置的硬编码(前缀)路径,你 * 可能 * 可以跳过它。
您可以运行:
请注意,正如user7498341所指出的,这并不适用于真正应该使用
PREFIX
的情况。ttvkxqim4#
我跨平台构建CMake项目的方法如下:
./project-root/build/stage
中-如果不是绝对路径,则总是将其视为相对于当前目录的路径).
中配置的项目。它将执行install
目标,如果需要构建依赖目标,它还构建所有必需的依赖目标,然后将文件复制到CMAKE_INSTALL_PREFIX
(在本例中为./project-root/build/stage
。对于多配置构建,如在Visual Studio中,您还可以使用可选的--config <config>
标志指定配置。cmake --build
命令的好处是,它适用于所有生成器(即makefile和Visual Studio),而不需要其他命令。之后我使用安装的文件来创建包或将它们包含在其他项目中...
ldioqlga5#
从CMake 3.15开始,实现这一点的正确方法是使用:
正式文件
qij5mzcb6#
从CMake 3.21开始,您可以使用
--install-prefix
选项,而不是手动设置CMAKE_INSTALL_PREFIX
。configure --prefix=DIR && make all install
的现代等价物现在是:pgx2nnw87#
关于布鲁斯·亚当斯的回答:
您的回答会造成危险的混淆。DESTDIR是为根目录树以外的安装而设计的。如果没有指定DESTDIR,它可以让用户看到根目录树中安装了什么。PREFIX是真实的安装所基于的基目录。
例如,PREFIX=/usr/local表示软件包的最终目的地是/usr/local。使用DESTDIR=$HOME将安装文件,就好像$HOME是根目录(/)一样。如果DESTDIR是/tmp/destdir,就可以看到“make install”会产生什么影响。在这种精神下,DESTDIR应该永远不会影响已构建的对象。
一个makefile文件段来解释它:
程序必须假设PREFIX是最终目录(即生产目录)的基目录。符号链接安装在DESTDIR=/something中的程序的可能性仅意味着程序不会访问基于PREFIX的文件,因为它根本无法工作。cat(1)是一个(最简单的形式)可以从任何地方运行的程序。下面是一个不会的例子:
如果您尝试从$PREFIX/bin/prog以外的其他位置运行prog,则永远不会找到prog.db,因为它不在预期的位置。
最后,/etc/alternatives实际上并不是这样工作的。根目录树中有一些指向安装程序的符号链接(例如vi -〉/usr/bin/nvi,vi -〉/usr/bin/vim,等等)。
nr9pn0ug8#
如果使用CMake,调用实际的构建系统(例如通过
make
命令)被认为是不好的做法。强烈建议这样做:1.配置+生成阶段:
1.构建和安装阶段:
当遵循这种方法时,发生器可以很容易地切换(例如Ninja的
-G Ninja
),而不必记住任何发生器特定的命令。请注意,
CMAKE_BUILD_TYPE
变量仅由单配置生成器使用,而build命令的--config
参数仅由多配置生成器使用。kx7yvsdv9#
答案很多,但我想我会做一个总结,以适当地分组,并解释他们的差异。
首先,您可以通过以下两种方式之一定义前缀:在配置期间或安装时,这实际上取决于您的需求。
配置期间
两个选项:
安装期间
优点:如果要更改,无需重新配置。
两个选项: