Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么“project()”会影响CMake';s对“无效”的看法?_Cmake_Installation - Fatal编程技术网

为什么“project()”会影响CMake';s对“无效”的看法?

为什么“project()”会影响CMake';s对“无效”的看法?,cmake,installation,Cmake,Installation,对于我的CMake项目,我希望构建32位和64位版本的库,并使用CMake将它们安装在正确的位置 但是,即使我使用了GNUInstallDirs模块,CMake也没有将库安装在正确的位置 我一直在追踪这个问题,直到project()影响了void*的大小,这似乎很奇怪。(GNUInstallDirs使用“CMAKE_SIZEOF_VOID_P”) 使用以下CMakeLists.txt: cmake_minimum_required(VERSION 3.7) if (CMAKE_SIZEOF_VO

对于我的CMake项目,我希望构建32位和64位版本的库,并使用CMake将它们安装在正确的位置

但是,即使我使用了
GNUInstallDirs
模块,CMake也没有将库安装在正确的位置

我一直在追踪这个问题,直到
project()
影响了void*的大小,这似乎很奇怪。(GNUInstallDirs使用“CMAKE_SIZEOF_VOID_P”)

使用以下CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
    message (STATUS "CMake think we are compiling for 64-bit")
else ()
    message (STATUS "CMake think we are compiling for something not 64-bit")
endif()
结果是“CMake认为我们是为64位编译的”

但是如果我加上

project(x)
最后,CMake输出“CMake认为我们编译的不是64位”

project()
中的什么改变了这一点,我如何避免呢?

调用
project()
初始化大多数与编译器相关的东西。在此之前,几乎所有的CMake命令甚至变量都不能按预期工作。但是,CMake不会产生关于这一点的错误

变量的文档明确指出,它的值“由try-compile确定”,因此在调用
project()
之前检查它是无用的:编译器还没有设置

正确的用法是:

cmake_minimum_required(VERSION 3.7)
project() # Initialize compiler-related stuff
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
    message (STATUS "CMake think we are compiling for 64-bit")
else ()
    message (STATUS "CMake think we are compiling for something not 64-bit")
endif()

有趣的是,no
project()
给出的答案是正确的,但推迟给出的答案是错误的。CMake(叹气)…欢迎来到未定义的行为世界!:)我同意,在使用命令之前-
project()
的情况下,行为实际上是未定义的。这里似乎有一个重要的警告。尽管文档说明
CMAKE\u size of\u VOID\u P
是由“尝试编译”决定的,但此编译似乎没有使用
CMAKE\u C\u标志。尝试使用“-m32”,它仍然会显示8(对于64位)。用CMake 3.5.2在Ubuntu上测试了这一点。但是一个带有短程序的
try_run
将使用
CMAKE_C_标志
并返回4。您的回答已经很久了,但文档中的要求似乎没有得到满足。如果不运行
try\u compile
,“
CMAKE\u SIZEOF\u VOID\u P”的值是否有效?根据thorni56的回答,
CMAKE\u SIZEOF\u VOID\u P
的值可靠吗?“
CMAKE\u SIZEOF\u VOID\u P
的值在没有运行
try\u compile
的情况下有效吗?”-不确定“没有
try\u compile
”是什么意思。此变量在
project()
call上设置。确定值的方式类似于
try\u compile
命令,但这是CMake内部的。