我的项目中有一个库,我想在32位上编译一次,而不是64位(同时,在我的编译结束时,我想要这两个版本)。这有可能吗?还是我必须调用2次cmake + make,但参数不同?
发布于 2015-08-05 15:08:34
基本上,答案取决于可用的工具链。例如,较早的SJLJ MinGW gcc版本是多目标的,使用它们编译32位可以通过添加命令行选项-m32来完成--这很容易由CMake完成。
然而,在单个目标gcc工具链(现在大多数都是)中,您只能针对一个体系结构。这意味着您必须让CMake使用两个工具链,每个目标体系结构都要使用一个。
最好是为32位和64位目标配置和构建。
示例
如果您确实希望在CMake中使用多目标工具链,请举一个快速示例。此示例使用MinGW SJLJ工具链
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 );
#endiftest.c
#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发布于 2015-08-05 15:57:57
我的简单答案是NO。64位和32位构建应该被认为是独立的平台;生成的工件不兼容。(这不是关于cmake的评论,而是操作系统(至少是linux和windows )是如何实现的。从单个cmake生成中,您不能为多个平台构建。有些生成器支持多个配置(即调试和发布),但没有一个支持多个平台。
话虽如此,使用无源cmake构建,您可以使用以下方式为多个平台生成构建:
mkdir build-x64
mkdir build-x86
cd build-x64
cmake -G"Visual Studio 10 2010 Win64" ..
cmake --build .
cd ../build-x86
cmake -G"Visual Studio 10 2010" ..
cmake --build .这可能不像你所希望的那么简单,但我不认为它有那么糟糕。这当然是我能够使用cmake和支持32位和64位构建的一种方式。
发布于 2015-08-06 09:10:42
谢谢你的关注。正如Brian所说,这取决于工具链。他的榜样很好!我也有同样的想法,而且似乎奏效了。我使用了add_library(),并为每个库定义了一个目标属性。以这种方式实现它,我的cmake + make将生成32位和64位的库,我不需要运行cmake + make的时间。在我的项目上下文中,我只需要在32位中创建一个可执行文件,但是有些库需要64位才能用于其他用途(项目之间的公共库:)。
安东
https://stackoverflow.com/questions/31835668
复制相似问题