我们有三个目标。一个是静态库,一个是共享库,一个是程序。我们正在尝试将目标特定的链接器标志添加到共享库和程序中。
当我们尝试附加我们需要的标志时:
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_property
,set_target_properties
和LINK_FLAGS
的文档。它们没有提供必要的细节,也没有提供示例。 set_target_properties
的文档特别迷人。
我们如何添加目标特定的链接标志?
答案 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
属性管理的字符串。上面有点不必要的缩进是为了强调这个事实。