0

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

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

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 丢失了,所以在 Solaris 下测试早期 Xeon 的结果是:

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

这是set_property,set_target_properties和的文档LINK_FLAGS。他们没有提供必要的细节,也没有提供示例。医生set_target_properties特别迷人。

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

4

1 回答 1

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属性管理的字符串。上面有些不必要的缩进是为了强调这一事实。

于 2017-08-27T12:41:26.887 回答