ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 CMAKE_INSTALL_PREFIX

我想生成带有安装目标的 Makefile,安装到 /usr 而不是默认的 /usr/local。假设构建目录在源子目录中完成,我执行:

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

CMakeCache.txt 包含:CMAKE_INSTALL_PREFIX:PATH=/usr(好的?)

现在我执行:

make
make install

所有文件仍安装到 usr/local。怎么了?

编辑:任何 CMakeLists.txt 项目文件中都没有 CMAKE_INSTALL_PREFIX 。在运行 cmake 之前,我从输出目录中删除了所有内容。 CMakeLists.txt 中的安装指令如下所示:

install(TARGETS mylibrary DESTINATION lib)


J
James

那应该是(参见 docs):

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

p
plaes

有两种方法可以使用此变量:

将它作为命令行参数传递,就像 Job 提到的那样:cmake -DCMAKE_INSTALL_PREFIX=< install_path > ..

在 CMakeLists.txt 中为其赋值: SET(CMAKE_INSTALL_PREFIX < install_path >) 但请记住将其放置在 PROJECT(< project_name>) 命令之前,否则它将不起作用!


奇怪的是,只有将 SET() 语句放在 PROJECT() 语句(CMake 2.8)之后,它才对我有用。
This answer 及其链接的参考文献更直接地讨论了 project() 命令之前/之后的问题。
这个 PROJECT 命令是什么以及如何在它之前有这个 cmake 选项?你会有一个例子吗?
set(CMAKE_INSTALL_PREFIX "/usr" CACHE STRING " " FORCE ) , 放在 project(<project_name>) 之后也没关系。
J
Jim

但请记住将它放在 PROJECT() 命令之前,否则它将不起作用!

我使用 cmake 的第一周——在使用了几年的 GNU autotools 之后——所以我仍在学习(比编写 m4 宏更好),但我认为在设置项目后修改 CMAKE_INSTALL_PREFIX 是更好的地方。

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
project (BarkBark)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")

首次运行(无缓存)

CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- The C compiler identification is GNU 4.4.7
-- etc, etc,...
CIP = /usr/local (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

第二轮

CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

如果我弄错了,请告诉我,我还有很多事情要做。好有趣。


执行 SET 时尝试使用 FORCE: set (CMAKE_INSTALL_PREFIX /foo/bar/bubba CACHE PATH "Cmake prefix" FORCE)