我想为我的用户提供一个在32位和64位版本之间进行选择的选项,并使用一个选项在他们之间切换。如果选项设置,我想补充-m32
到CMAKE_C_FLAGS
,CMAKE_CXX_FLAGS
和CMAKE_EXE_LINKER_FLAGS
。我也打电话set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS 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;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
project(usezlib32)
add_executable(usezlib32 main.cpp)
find_package(ZLIB)
if (ZLIB_FOUND)
include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries(usezlib32 ${ZLIB_LIBRARIES})
endif()
调用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命令find_library仅考虑文件名执行搜索,不对找到的文件执行其他检查。
因此,查找32位库而不是64位库的唯一方法是使用32位库来查找目录,然后在其中查找64位库:
find_library
有关更多详细信息,请参见算法)。由于您的路径/opt/anaconda/lib/libz.so
不符合此规则,因此此属性无法为您提供帮助。
CMAKE_LIBRARY_PATH
CMake缓存变量设置为包含32位库的目录列表。因此,这些目录将在其他目录之前进行搜索。在这种情况下,您可以执行以下操作:
set(CMAKE_LIBRARY_PATH "/usr/lib/i386-linux-gnu" CACHE PATH "<desc>")
或者,可以将此变量cmake
与-D
option一起传递给。
CMAKE_LIBRARY_PATH
环境变量设置为目录列表,包含32位库。因此,这些目录将在其他目录之前进行搜索。在这种情况下,您可以执行以下操作:
set(ENV{CMAKE_LIBRARY_PATH} "/usr/lib/i386-linux-gnu")
可能其他非系统库的路径也存储在此变量中。因此,在更改它时要小心:您可能会中断对项目所需的其他库的搜索。
CMAKE_PREFIX_PATH
,或find_package(XXX)
对特定程序包有影响的其他变量。例如,对于zlib,可以设置ZLIB_ROOT
指向zlib安装目录的变量。尽管这种方法无疑有助于找到所需的库版本,但它比其他方法更具针对性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句