使用Stakefier和CMake

时间:2011-12-07 07:28:36

标签: cmake

我该如何使用

http://statifier.sourceforge.net/ statifier这样的工具可以使库静态化吗?

2 个答案:

答案 0 :(得分:1)

您始终可以custom_target使用libraryexecutable来处理特殊事项。

如果你想在cmake中更改linker-command,我知道的最低级别是覆盖CMAKE_CXX_LINK_EXECUTABLE - 变量(对于C,它是CMAKE_C_LINK_EXECUTABLE)来使用你自己的链接器。如果您这样做,请注意该变量中的特殊<> - 字段。有关所有变量,请参阅here。下面的部分(扩展规则)显示了可以在cmake的构建变量中使用的特殊“标记”。

答案 1 :(得分:0)

我在我的主CMakeLists.txt

#-----------------------------------------------------------------
# statifier determine (http://statifier.sourceforge.net/) for linux
#-----------------------------------------------------------------
set(FOOBAR-HAS-STATIFIER false)

if (UNIX)

  find_program(STATIFIER_EXE NAMES "statifier")

  if (NOT STATIFIER_EXE STREQUAL STATIFIER_EXE-NOTFOUND)

    set(FOOBAR-HAS-STATIFIER true)

    macro(MAKE_STATIC_EXE _static_exe_out)
      foreach (_target ${ARGN})
        set(_shared_exe "${CMAKE_CURRENT_BINARY_DIR}/${_target}")
        set(_static_exe "${CMAKE_CURRENT_BINARY_DIR}/${_target}-static/${_target}")
        add_custom_command(POST_BUILD
          OUTPUT ${_static_exe}
          COMMAND ${STATIFIER_EXE} --set=LD_BIND_NOW=yes ${_shared_exe} ${_static_exe}
          DEPENDS ${_shared_exe}
          )
        SET(${_static_exe_out} ${${_static_exe_out}} ${_static_exe})
      endforeach()
    endmacro()

  else ()

    message ("statifier (http://statifier.sourceforge.net/) not found. Can not build setup for unix")

  endif ()

endif ()

以及稍后在主应用CMakeLists.txt

##
## static foobar
##
if (FOOBAR-HAS-STATIFIER)
  make_static_exe(FOOBAR-STATIC-dynstat dynstat)
  message("${FOOBAR-STATIC-dynstat}")
endif ()

在构建完成后,在构建目录中有一个foobar和一个静态foobar-static可执行的。