我的项目中有一个库,我希望以32位而不是64位编译一次(同时,例如,在编译结束时,我希望有2个版本)。
这可能吗,或者我必须调用两次cmake + make,但参数不同?
最佳答案
本质上,答案取决于可用的工具链。例如,较旧的SJLJ MinGW gcc版本是多目标的,可以通过添加命令行选项-m32
来完成与它们的32位编译-这可以通过CMake轻松完成。
但是,在单个目标gcc工具链中(现在大多数情况下),您只能针对一种体系结构。这意味着您必须让CMake使用两个工具链,每个要支持的目标体系结构一个。
最好为32位和64位目标进行配置和构建。
例
一个简单的示例,如果您确实想在CMake中使用多目标工具链。本示例使用MinGW SJLJ toolchain
CMakeLists.txt
cmake_minimum_required( VERSION 2.8 )
project( mylib )
add_library( mylib_32 mylib.c mylib.h )
set_target_properties( mylib_32 PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -m32" )
set_target_properties( mylib_32 PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32" )
add_executable( test_32 test.c )
target_link_libraries( test_32 mylib_32 )
set_target_properties( test_32 PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -m32" )
set_target_properties( test_32 PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32" )
add_library( mylib_64 mylib.c mylib.h )
add_executable( test_64 test.c )
target_link_libraries( test_64 mylib_64 )
mylib.c
int PointerSize( void )
{
return sizeof( void* );
}
mylib.h
#ifndef MYLIB_H
#define MYLIB_H
extern int PointerSize( void );
#endif
测试
#include <stdio.h>
#include "mylib.h"
int main( int argc, char* argv[] )
{
printf( "Pointer Size: %d\n", PointerSize() );
return 0;
}
输出量
运行两个结果程序会为库函数
PointerSize()
提供32位和64位结果C:\>test_32.exe
Pointer Size: 4
C:\>test_64.exe
Pointer Size: 8
关于c++ - cmake和2个库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31835668/