2013-03-20 112 views
2

我正在開發一個小型仿真軟件,它依賴於兩個庫,即GSL和libconfig。作爲構建系統,我使用CMake。對於GSL和libconfig,我找到cmake文件並將它們複製到我項目的cmake/目錄中。CMake:基於BUILD_TYPE的靜態和動態鏈接

的情況如下:我想這個項目有幾個不同的生成類型,如debugrelease等,也被稱爲cluster自定義的,它增加了-static到GCC標誌和反對.a庫鏈接GSL和我認爲存在的libconfig。

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腳本設置了一個LIBCONFIG_LIBRARY和一個LIBCONFIG_STATIC_LIBRARY變量,我可以使用它。

什麼是最優雅或最聰明的方式來達到我的目標?

回答

5

我解決了它這樣的:

,用戶可以指定一個額外的變量-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) 
6

Acording向CMake documentation,cmake的使用變量BUILD_SHARED_LIBS確定add_library默認的()。

如果設置爲ON的CMake將承擔一切add_library()的通話將被作爲

add_library(target SHARED lib1 lib2 ...) 

例如像-DBUILD_SHARED_LIBS = ON CMake的命令行可以做你的要求。