使用set_target_properties和LINK_FLAGS时缺少目标的链接标志

时间:2017-08-27 12:09:47

标签: cmake solaris linker-flags

我们有三个目标。一个是静态库,一个是共享库,一个是程序。我们正在尝试将目标特定的链接器标志添加到共享库和程序中。

当我们尝试附加我们需要的标志时:

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
    CRYPTOPP_XARCH_OPTIONS = "-xarch=ssse3 -xarch=sse4_1 ..."
endif()
...

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND "-M cryptest.mapfile")
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR})
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND ${CRYPTOPP_XARCH_OPTIONS})
endif ()

导致失败:

CMake Error at CMakeLists.txt:631 (set_target_properties):
 set_target_properties called with incorrect number of arguments.

当我们因缺少X = ${X} Y而尝试使用+= operator语法时,会以静默方式删除属性:

if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} "-M cryptest.mapfile")
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR})
    set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} ${CRYPTOPP_XARCH_OPTIONS})
endif ()

例如,mapfile已丢失,因此在早期Xeon的Solaris下进行测试会导致:

$ ./cryptest.exe v
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x4800000  [ AES SSE4.1 ]
Killed

以下是set_propertyset_target_propertiesLINK_FLAGS的文档。它们没有提供必要的细节,也没有提供示例。 set_target_properties的文档特别迷人。

我们如何添加目标特定的链接标志?

1 个答案:

答案 0 :(得分:0)

建议使用target_link_libraries()作为链接器标志。

set(CRYPTOPP_XARCH_OPTIONS 
  -xarch=ssse3 
  -xarch=sse4_1 
  ...)
target_link_libraries(cryptest-program
  -M cryptest.mapfile
  ${CRYPTOPP_XARCH_OPTIONS})

请注意,在所有情况下,您都在处理列表,而不是您必须使用LINK_FLAGS属性管理的字符串。上面有点不必要的缩进是为了强调这个事实。