cmake和2个图书馆

时间:2015-08-05 14:40:25

标签: c++ c cmake

我的项目中有一个库,我想用32位而不是64位编译一次(同时,例如在编译结束时我希望有2个版本)。 这是可能的还是我必须拨打2次cmake + make但是参数不同?

3 个答案:

答案 0 :(得分:1)

基本上答案取决于可用的工具链。例如,较旧的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

test.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

答案 1 :(得分:1)

我的简单回答是。 64位和32位版本应被视为单独的平台;没有关于生成的工件是兼容的。 (这不是对cmake的评论,而是如何实现操作系统,至少是linux和windows。)从单个cmake构建,你不能为多个平台构建。有些发生器支持多种配置(即Debug和Release),但没有一种支持多种平台。

话虽如此,使用out-of-source 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位构建的一种方式。

答案 2 :(得分:0)

谢谢你的关注。 正如Brian所说,这取决于工具链。他的榜样很好!我有同样的想法,似乎工作。 我使用了add_library(),并为每个库定义了一个目标属性。以这种方式实现它,我的cmake + make以32位和64位生成我的库,我不需要运行到cmake + make的次数。 在我的项目的上下文中,我需要只创建一个32位的可执行文件,但是64位需要一些库用于其他用途(项目之间的公共库:)。

安东