我们有三个目标。一个是静态库,一个是共享库,一个是程序。我们正在尝试将目标特定的链接器标志添加到共享库和程序中。
当我们尝试附加我们需要的标志时:
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
特别迷人。
我们如何添加目标特定的链接标志?