cmake . && make all install
"命令,它可以正常工作,但会安装到/usr/local
目录。我需要将其安装到其他前缀目录(例如
/usr
)。请问如何修改
cmake
和make
的命令行参数以将其安装到/usr
而不是/usr/local
?cmake . && make all install
"命令,它可以正常工作,但会安装到/usr/local
目录。/usr
)。cmake
和make
的命令行参数以将其安装到/usr
而不是/usr/local
?/usr .
- bodacydo在被接受的答案中,":PATH" 这部分可以省略。以下语法可能更易记:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
...如此处中的答案所述。
:PATH
不是错误。 - kirbyfan64sos请注意,在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
的情况。
DESTDIR
的使用,但这实际上是错误的。您应该参考cmake文档https://cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html... 使用命令make DESTDIR=/home/john install
安装相关软件,会使用安装前缀(例如“/usr/local”)加上DESTDIR
的值,最终得到“/home/john/usr/local”。 - Joakimcmake --build build --target install -- DESTDIR=/usr
。注意:这也适用于Ninja生成器(规则似乎包含$ENV{DESTDIR}
)。 - Mizux从CMake 3.15开始,实现这一点的正确方法是使用:
cmake --install <dir> --prefix "/usr"
注意,cmake --install
不会为您调用 cmake --build
。
<dir>
是指构建目录的路径吗?通常是build/
吗? - undefined我跨平台构建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),无需不同的命令。之后,我使用安装的文件创建软件包或将其包含在其他项目中...
cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
。 - codenamezeromake -j $(nproc)
指定构建线程数,在Makefile生成器中执行cmake --build . --target=install --config=Release -- -j 8
,或在Visual Studio生成器中执行cmake --build . --target=install --config=Release -- /m:8
来使用8个线程。实际上,你可以在--
之后传递任何命令行参数。 - Cloud-j
不是 cmake 的标志,所有的标志都要在 --
之后传递给底层构建系统... - Cloud从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
关于Bruce Adams的回答:
您的回答会造成危险的混淆。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
如果使用CMake,调用实际的构建系统(例如通过make
命令)被认为是不良做法。强烈建议按如下方式进行:
Configure + Generation stages:
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
Build and Install stages:
cmake --build _builds/foo/debug --config Debug --target install
在采用这种方法时,可以轻松地切换生成器(例如 -G Ninja
用于 Ninja),无需记忆任何生成器特定的命令。
请注意,CMAKE_BUILD_TYPE
变量仅由单配置生成器使用,而构建命令的 --config
参数仅由多配置生成器使用。
CMAKE_BUILD_TYPE
。第二类依赖于在构建(然后也安装)期间提供的--config
参数。这是因为使用多配置生成器,可以从单个CMake配置构建许多类型。 - Adam Baduracmake -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
make install
命令以确保所有需要安装的东西都被正确地安装到了指定位置,而不会破坏我的开发机器。这只是一个例子。另一个情况是为另一个架构进行交叉编译。 - DanielCMakeLists.txt
文件,那么我就需要打补丁来修改原始源代码。只需使用一个命令行选项,就可以让我在Fedora的spec
文件中正确获取路径信息。 - Martin Ueding