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
如何使用CMake查找32位版本的zlib_Cmake_32bit 64bit_Zlib - Fatal编程技术网

如何使用CMake查找32位版本的zlib

如何使用CMake查找32位版本的zlib,cmake,32bit-64bit,zlib,Cmake,32bit 64bit,Zlib,我想为我的用户提供一个选项,在32位和64位构建之间进行选择,并使用一个选项在它们之间进行切换。如果设置了该选项,我会将-m32添加到CMAKE_C_标志,CMAKE_CXX_标志,以及CMAKE_EXE_链接器_标志。我还调用set\u属性(全局属性FIND\u LIBRARY\u USE\u LIB64\u path OFF)。到目前为止,这一切都很好,但现在我试图找到库zlib,并始终获得导致链接器失败的64位版本 我发现,它有同样的问题,但没有解决方案,适合我。像Glenn Coombs

我想为我的用户提供一个选项,在32位和64位构建之间进行选择,并使用一个选项在它们之间进行切换。如果设置了该选项,我会将
-m32
添加到
CMAKE_C_标志
CMAKE_CXX_标志
,以及
CMAKE_EXE_链接器_标志
。我还调用
set\u属性(全局属性FIND\u LIBRARY\u USE\u LIB64\u path OFF)
。到目前为止,这一切都很好,但现在我试图找到库zlib,并始终获得导致链接器失败的64位版本

我发现,它有同样的问题,但没有解决方案,适合我。像Glenn Coombs一样,我不想让我的用户了解他们如何调用cmake来获得32位构建,因此,
CC=“gcc-m32”cmake
对我不起作用

编辑: 事实证明,这甚至不适用于电子邮件线程中提出的解决方案。下面是一个小例子:

main.cpp:

#include <iostream>
#include "zlib.h"

int main() {
    std::cout << ZLIB_VERSION << std::endl;
    std::cout << "pointer size: " << sizeof(void*) << std::endl;
    return 0;
}
调用
g++-m32 main.cpp-lz
会生成一个工作二进制文件,但调用
CC=“gcc-m32”CXX=“g++-m32”cmake&make
会导致以下错误:

/opt/anaconda/lib/libz.so: error adding symbols: File in wrong format
我想问题是为什么CMake看起来与g++不同。

CMake命令执行搜索时只考虑文件名,它不会对找到的文件执行其他检查

因此,找到32位库而不是64位库的唯一方法是先搜索带有32位库的目录,然后再搜索一个64位的目录:

  • 设置属性可能会禁用使用64位库搜索某些路径。它仅适用于包含“64”或“lib64”的路径(有关详细信息,请参阅
    find_library
    的算法)
由于路径
/opt/anaconda/lib/libz.so
不符合此规则,因此此属性对您没有帮助

  • CMAKE\u LIBRARY\u PATH
    CMAKE cache变量设置为包含32位库的目录列表。因此,这些目录将在其他目录之前进行搜索
在您的情况下,您可以执行以下操作:

set(CMAKE_LIBRARY_PATH "/usr/lib/i386-linux-gnu" CACHE PATH "<desc>")
set(ENV{CMAKE_LIBRARY_PATH} "/usr/lib/i386-linux-gnu")
可能其他非系统库的路径也存储在此变量中。所以在更改时要小心:您可能会中断对项目所需的其他库的搜索

  • 为特定包设置CMake或环境变量
    CMake\u PREFIX\u PATH
    ,或影响
    find\u package(XXX)
    的其他变量。例如,对于zlib,可以设置指向zlib安装目录的
    zlib\u ROOT
    变量

虽然这种方法确实有助于找到所需版本的库,但它比其他方法更针对特定目标。

据我所知,
find_library
只根据文件名进行搜索,它不会对找到的文件执行额外的检查。32位和64位zlib库的路径是什么?是的,CMake似乎只使用了第一个
libz。因此它找到了。g++似乎更聪明。问题是如何使CMake如此智能。为了回答您的问题,g++在
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../i386 linux gnu/libz.so
中找到了正确的版本。解析
/usr/lib/i386 linux gnu/libz.so
的相对路径。CMake在
/opt/anaconda/lib/libz中查找。那么
。您是否向/opt传递了一些奇怪的路径?否则CMake将不会在/opt中搜索。我安装了anaconda,它将自己添加到路径中。g++似乎不受此影响。谢谢您的详细回答。这将有助于让它在我的系统上工作,但感觉像是在CMake文件中硬编码一些东西,可能会因系统而异。因此,这是否能在另一台机器上工作取决于该机器的具体设置
g++-lz
将独立于设置找到正确的版本。我希望CMake能够从中抽象出来,并且FindZLIB能够准确地处理这种机器依赖,而不是引入它。如果在CMake中无法做到这一点,我会接受你的答案,但我会等待一段时间,以防有人有想法。明确地说,我的目标不是创建一个适合我的构建系统。我想要的东西,我可以给别人与最低数量的文件。我希望避免类似“如果您碰巧安装了64位zlib库(例如安装anaconda),并且该库位于路径上32位版本之前,那么您需要找到32位库并设置环境变量…”之类的文档。是的,我完全明白我的答案不是你最终想要的。它只是描述了为什么它会这样(也就是为什么您的尝试失败)。答案可能有助于其他人在特定机器上配置32位项目。可能是我的问题提示某人为你的问题做出正确的决定。猜测一下:
anaconda
是否可以配置为在
lib64/
子目录下安装64位库?在这种情况下,
FIND_LIBRARY\u USE_LIB64_path
可以工作。也许anaconda可以以不同的方式安装,但这也只能解决我机器上的问题。看起来没有办法让它在一般情况下起作用,所以我接受了你的答案。谢谢
set(ENV{CMAKE_LIBRARY_PATH} "/usr/lib/i386-linux-gnu")