2017-08-27 42 views
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_propertyset_target_propertiesLINK_FLAGS的文档。他们没有提供必要的细节,也没有提供例子。 set_target_properties的文档特别迷人。

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

+0

CMake命令的文档页面实际上是**详细的**:它们包含几乎完整的*正确*使用命令的信息。 'set_property'的文档描述了* APPEND *选项,并且该命令实际上接受它。相反,'set_target_properties'的文档没有描述这个选项,并且该命令不接受它。正如你从签名中可以看到的,只有*单值*(不是列表)属性可以用'set_target_properties'设置。至于“迷人”,可能是因为*错字*:“文件”应该被理解为“属性”。 – Tsyvarev

回答

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物业管理。上面有些不必要的缩进是为了强调这个事实。