3

GSL と libconfig の 2 つのライブラリに依存する小さなシミュレーション ソフトウェアを開発しています。ビルドシステムとして、CMake を使用しています。GSL と libconfig の両方について、cmake ファイルを見つけcmake/て、プロジェクトのディレクトリにコピーしました。

debugシナリオは次のとおりです。プロジェクトに、 などのいくつかの異なるビルド タイプを含めるだけでなく、GCC フラグに追加し、GSL および libconfig のライブラリに対してリンクreleaseする というカスタム ビルド タイプも含める必要があります。存在すると仮定します。cluster-static.a

CMakeLists.txtはこれまでのところ次のように見えます:

# version
SET(PACKAGE_VERSION "1.0")
SET(PACKAGE_NAME "INTERFACE")

PROJECT(interface C CXX)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)


# dirs -----------------------------------------------------

SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")

FIND_PACKAGE(GSL REQUIRED)
INCLUDE_DIRECTORIES(${GSL_INCLUDE_DIRS})
SET(LIBS ${LIBS} ${GSL_LIBRARIES})

FIND_PACKAGE(LibConfig REQUIRED)
INCLUDE_DIRECTORIES(${LIBCONFIG_INCLUDE_DIRS})
SET(LIBS ${LIBS} ${LIBCONFIG_LIBRARIES})

CONFIGURE_FILE("res/config.h.in" "config.h")
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})

SET_DIRECTORY_PROPERTIES(PROPERTIES 
    ADDITIONAL_MAKE_CLEAN_FILES "config.h"
)


# compilation ----------------------------------------------

ADD_EXECUTABLE( interface
    interface.c interface.h config.h
    helpers.c 
    output.c
    lattice.c 
    genetic.c
)

# optional CFLAGS
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -std=c99")
SET(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math")
SET(CMAKE_C_FLAGS_CLUSTER "-O3 -ffast-math -static")
SET(CMAKE_C_FLAGS_DEBUG "-g")
SET(CMAKE_C_FLAGS_PROFILE "-g -ffast-math -pg")

TARGET_LINK_LIBRARIES(interface m ${LIBS})



# installation --------------------------------------------

INSTALL(TARGETS interface DESTINATION bin)

-staticこれにより、を使用するときに がコンパイラに追加されます-DCMAKE_BUILD_TYPE=cluster。問題は、ライブラリのバージョンに対してまだリンクしているため.so、gcc がエラーをスローすることです。少なくとも、FindLibConfig.cmakeスクリプトは aLIBCONFIG_LIBRARYLIBCONFIG_STATIC_LIBRARY変数の両方を設定します。これを使用できます。

目標を達成するための最も洗練された、またはスマートな方法は何ですか?

4

2 に答える 2

7

私はこのようにそれを解決しました:

ユーザーは、追加の変数を指定できます-DSTATIC_LINKING=TRUE。次に、スクリプトは次のようになります。(静的リンクとコンパイルの重要な部分のみが表示されます!)

# determine, whether we want a static binary
SET(STATIC_LINKING FALSE CACHE BOOL "Build a static binary?")

# do we want static libraries?
# When STATIC_LINKING is TRUE, than cmake looks for libraries ending
# with .a. This is for linux only!
IF(STATIC_LINKING)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
ENDIF(STATIC_LINKING)

# set -static, when STATIC_LINKING is TRUE and set LINK_SEARCH_END_STATIC
# to remove the additional -bdynamic from the linker line.
IF(STATIC_LINKING)
    SET(CMAKE_EXE_LINKER_FLAGS "-static")
    SET_TARGET_PROPERTIES(surface PROPERTIES 
        LINK_SEARCH_END_STATIC 1)
ENDIF(STATIC_LINKING)
于 2013-03-23T11:12:53.677 に答える