Compilation of 32 and 64 bits

I am trying to compile code for 32 and 64 bits in the same CMakeLists.txt file. I thought the easiest way to do this is to use a function. The libraries (static) used in the compilation are also embedded in the CMakeLists.txt file. However, despite creating them in different directories, CMake complains that:

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

with problem code:

 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) 

I am sure that I am missing something obvious, but I do not see a problem ...

+4
source share
2 answers

As I said in my comment, here is an example of how we did this.

 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} ) 

This works well for us, even in our manufacturing process.

It allows top to have our configuration for both: 32 and 64 bits. After that, we must build on both platforms.

+3
source

<name> specified in add_library corresponds to the logical target name and must be globally unique within the project. Therefore, you define the same target (mylib) twice, which is prohibited. However, you can define two different goals and specify the target output name to get the same library name again:

 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

+1
source

Source: https://habr.com/ru/post/1488253/


All Articles