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