我做cmake . && make all install cmake . && make all install 。 这有效,但安装到/usr/local 。
我需要安装到不同的前缀(例如,到/usr )。
什么是安装到/usr而不是/usr/local的cmake和make命令行?
#1楼
可以省略接受的答案中的“:PATH”部分。 这种语法可能更令人难忘:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
...在这里的答案中使用。
#2楼
请注意,在CMake和Autotools中,您不必总是在配置时设置安装路径。 您可以在安装时使用DESTDIR (另请参见此处 ),如下所示:
make DESTDIR=<installhere> install
另请参阅此问题 , 该问题解释了DESTDIR和PREFIX之间的细微差别。
这适用于分阶段安装,并允许将程序存储在与其运行位置不同的位置,例如/etc/alternatives通过符号链接。
但是,如果您的程序包是可重定位的,并且不需要通过configure阶段设置的任何硬编码(前缀)路径, 则可以跳过它。 所以代替:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
你会运行:
cmake . && make DESTDIR=/usr all install
请注意,正如user7498341指出的那样,这不适合您真正应该使用PREFIX的情况。
#3楼
我跨平台构建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楼
关于布鲁斯亚当斯回答:
你的答案会造成危险的混乱。 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等)。
#5楼
如果使用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 for Ninja ),而不必记住任何特定于发生器的命令。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3175283