2017-08-27 859 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物業管理。上面有些不必要的縮進是爲了強調這個事實。