0
我们有三个目标。一个是静态库,一个是共享库,一个是程序。我们正在尝试将特定于目标的链接器标志添加到共享库和程序中。使用set_target_properties和LINK_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()
例如,th Ë映射文件丢失,从而测试在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
的文档特别迷人。
我们如何添加特定于目标的链接标志?
CMake命令的文档页面实际上是**详细的**:它们包含几乎完整的*正确*使用命令的信息。 'set_property'的文档描述了* APPEND *选项,并且该命令实际上接受它。相反,'set_target_properties'的文档没有描述这个选项,并且该命令不接受它。正如你从签名中可以看到的,只有*单值*(不是列表)属性可以用'set_target_properties'设置。至于“迷人”,可能是因为*错字*:“文件”应该被理解为“属性”。 – Tsyvarev