2013-06-26 7 views
4

Я пытаюсь скомпилировать код для 32 и 64 бит в том же файле CMakeLists.txt. Я думал, что самый простой способ сделать это - использовать функцию. Библиотеки (статические), используемые в компиляции, также встроены в файл CMakeLists.txt. Однако, несмотря на их создание в разных каталогах, CMake жалуется, что:Компиляция 32 и 64 бит

add_library cannot create target "mylib" because another target with 
the same name already exists. The existing target is a static library 
created in source directory "/home/chris/proj". 

с проблемой кода существа:

cmake_minimum_required (VERSION 2.6 FATAL_ERROR) 

enable_language(Fortran) 
project(myproj) 

set(libfolder ${PROJECT_SOURCE_DIR}/lib/) 

function(build bit) 

    message("Build library") 
    set(BUILD_BINARY_DIR ${PROJECT_BINARY_DIR}/rel-${bit}) 
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BUILD_BINARY_DIR}/bin) 
    add_library(mylib STATIC ${libfolder}/mylib.for) 
    set(CMAKE_Fortran_FLAGS "-m${bit}") 

endfunction() 

build(32) 
build(64) 

Я уверен, что я что-то очевидное отсутствует, но не может видеть проблема ...

+1

У нас была такая же проблема с нашим программным обеспечением. Мы выбрали решение для создания опции, чтобы решить, находится ли она в 32 или 64. И мы создаем в 2 раза наше программное обеспечение в каждом режиме. Я могу привести вам пример того, как мы это делаем. –

+0

Возможный дубликат [Компиляция 32-битного и 64-битного проекта с использованием CMake] (http://stackoverflow.com/questions/4029587/compiling-32-bit-vs-64-bit-project-using-cmake) – mlt

ответ

3

Как я уже сказал в своем комментарии, вот пример того, как мы это сделали.

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    MESSAGE("64 bits compiler detected") 
    SET(EX_PLATFORM 64) 
    SET(EX_PLATFORM_NAME "x64") 
else(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    MESSAGE("32 bits compiler detected") 
    SET(EX_PLATFORM 32) 
    SET(EX_PLATFORM_NAME "x86") 
endif(CMAKE_SIZEOF_VOID_P EQUAL 8) 

... 

IF(EX_PLATFORM EQUAL 64) 
MESSAGE("Outputting to lib64 and bin64") 

# ---------- Setup output Directories ------------------------- 
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/lib64 
    CACHE PATH 
    "Single Directory for all Libraries" 
    ) 

# --------- Setup the Executable output Directory ------------- 
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/bin64 
    CACHE PATH 
    "Single Directory for all Executables." 
    ) 

# --------- Setup the Executable output Directory ------------- 
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/lib64 
    CACHE PATH 
    "Single Directory for all static libraries." 
    ) 
ELSE(EX_PLATFORM EQUAL 64) 
# ---------- Setup output Directories ------------------------- 
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/lib 
    CACHE PATH 
    "Single Directory for all Libraries" 
    ) 

# --------- Setup the Executable output Directory ------------- 
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/bin 
    CACHE PATH 
    "Single Directory for all Executables." 
    ) 

# --------- Setup the Executable output Directory ------------- 
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY 
    ${YourSoftwarePath}/lib 
    CACHE PATH 
    "Single Directory for all static libraries." 
    ) 
ENDIF(EX_PLATFORM EQUAL 64) 

... 


add_library(YourSoftware SHARED 
    ${INCLUDES} 
    ${SRC} 
) 

Это хорошо работает для нас, даже в нашем производственном процессе.

Он позволяет верхней конфигурации нашей конфигурации для обоих: 32 и 64 бит. После этого мы должны построить в обеих платформах.

+1

Хмм , то, что я не могу решить, - как построить 32- и 64-разрядные, включая статические библиотеки, в 1 файле CMakeLists. Я знал, что вы можете обнаружить архитектуру системы, но мне очень хотелось бы построить обе архитектуры во вложенные папки каталога выпуска. – ChrisW

+0

Я не могу, если вы можете это сделать. Но вы можете использовать команду 'install' для копирования ваших файлов результатов в нужные вам директории. У нас есть обходной путь для этого. Я попытаюсь сделать наглядный пример этого. –

0

The <name>, указанного в add_library соответствует логическому имени цели и должны быть глобально уникальным в рамках проекта. Следовательно, вы определяете одну и ту же цель (mylib) дважды, что запрещено. Однако вы можете определить две различные цели и указать имя выходного цели, чтобы получить такое же имя библиотеки снова:

add_library(mylib${bit} STATIC ${libfolder}/mylib.for) 
set_target_properties(mylib${bit} PROPERTIES OUTPUT_NAME mylib) 

http://www.cmake.org/cmake/help/v3.0/command/add_library.html http://www.cmake.org/cmake/help/v3.0/command/set_target_properties.html

Смежные вопросы