5

同じ CMakeLists.txt ファイルで 32 ビットと 64 ビットのコードをコンパイルしようとしています。これを行う最も簡単な方法は、関数を使用することだと思いました。コンパイルで使用される (静的) ライブラリも CMakeLists.txt ファイルに組み込まれています。ただし、それらを異なるディレクトリに構築しているにもかかわらず、CMake は次のように不満を述べています。

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)

明らかな何かが欠けていると確信していますが、問題がわかりません...

4

2 に答える 2

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 ビットの両方の構成を準備できます。その後、両方のプラットフォームでビルドする必要があります。

于 2013-06-26T10:28:02.143 に答える