Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker CMake:基于构建类型的静态和动态链接_Linker_Cmake_Libconfig - Fatal编程技术网

Linker CMake:基于构建类型的静态和动态链接

Linker CMake:基于构建类型的静态和动态链接,linker,cmake,libconfig,Linker,Cmake,Libconfig,我正在开发一个小型仿真软件,它依赖于两个库,GSL和libconfig。作为构建系统,我使用CMake。对于GSL和libconfig,我找到了cmake文件,并将它们复制到我的项目的cmake/目录中 场景如下:我希望项目有几种不同的构建类型,比如debug,release,等等,但也有一种称为cluster的定制构建类型,它将-static添加到GCC标志和与.aGSL和libconfig库相对应的链接中,我假设存在这些库 到目前为止,我的CMakeLists.txt看起来像这样: # ve

我正在开发一个小型仿真软件,它依赖于两个库,GSL和libconfig。作为构建系统,我使用CMake。对于GSL和libconfig,我找到了cmake文件,并将它们复制到我的项目的
cmake/
目录中

场景如下:我希望项目有几种不同的构建类型,比如
debug
release
,等等,但也有一种称为
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)
当我使用
-DCMAKE\u BUILD\u TYPE=cluster
时,这会将
-static
添加到编译器中。问题是,它仍然链接到libs的
.so
版本,这会导致gcc抛出错误。至少
FindLibConfig.cmake
脚本设置了
LIBCONFIG_库
LIBCONFIG_静态_库
变量,我可以使用它们

达到我的目标最优雅或最聪明的方法是什么?

我是这样解决的:

用户可以指定一个附加变量
-DSTATIC_LINKING=TRUE
。然后,脚本看起来像这样。(仅显示静态链接和编译的重要部分!)

根据cmake,cmake使用变量BUILD_SHARED_LIBS来确定add_library()的默认值

如果设置为ON,则cmake将假定所有
add\u library()
调用都将为

add_library(target SHARED lib1 lib2 ...)
例如,cmake命令行上的-DBUILD\u SHARED\u LIBS=ON可能会执行您的要求

add_library(target SHARED lib1 lib2 ...)