我想通過輸入我的CMakeLists.txt
文件,實際工作中也依賴建設方面,以提高其他的解決方案。
解決濫用CMake的
cmake_minimum_required(VERSION 2.8)
add_library(lib1 test1.cpp)
add_library(lib2 test2.cpp)
include_directories(${CMAKE_CURRENT_DIR})
add_executable(mainexec main.cpp)
target_link_libraries(mainexec combinedLib) # Important to place before add_custom_target
set(LIBNAME "combinedLib.lib")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND lib.exe /OUT:${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
add_custom_target(combinedLib
DEPENDS ${LIBNAME}
)
請注意,此解決方案至今工作與Visual Studio,但我想它可以製成多平臺兼容。我可以想像,以下版本可能會爲基於Unix平臺上工作:
set(LIBNAME "libCombinedLib.a")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND ar -rcT ${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
注意,這些解決方案在某種程度上濫用CMake的,因爲它會抱怨型UTILITY(而不是靜態或共享)的目標,如果你放置在add_custom_target
聲明後致電target_link_libraries
。
CMake的目標聲明兼容的解決方案
爲了使CMake的標準,您可以通過
target_link_libraries(mainexec ${LIBNAME})
add_dependencies(mainexec combinedLib)
在我的情況下更換`target_link_libraries'調用它並不完全令人滿意,因爲mainexec
有知道combinedLib
,雖然它期望所有的依賴由target_link_libraries
調用處理。
用更少的耦合替代解決方案
看起來有點進一步向進口的目標,我終於找到了解決我的最後一個問題的解決方案:如果您打算模塊化整個後添加GLOBAL
cmake_minimum_required(VERSION 2.8)
add_library(lib1 test1.cpp)
add_library(lib2 test2.cpp)
include_directories(${CMAKE_CURRENT_DIR})
add_executable(mainexec main.cpp)
set(LIBNAME "combinedLib.lib")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND lib.exe /OUT:${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
add_custom_target(combinedLibGenerator
DEPENDS ${LIBNAME}
)
add_library(combinedLib STATIC IMPORTED)
set_property(TARGET combinedLib PROPERTY IMPORTED_LOCATION ${LIBNAME})
add_dependencies(combinedLib combinedLibGenerator)
target_link_libraries(mainexec combinedLib)
STATIC IMPORTED
使導入的目標全局可見。
便攜式CMake的解決方案
與當前版本的CMake CMake的爲傳遞依賴和接口庫的完全支持。接口庫可以與其他庫「鏈接」,而這個接口庫又可以被「鏈接」。爲什麼引號?雖然這很好,但這實際上不會創建一個物理的,組合的庫,而是爲這組「子庫」創建一種別名。這仍然是我們最終需要的解決方案,這就是爲什麼我想在這裏添加它。
add_library(combinedLib INTERFACE)
target_link_libraries(combinedLib INTERFACE lib1 lib2)
target_link_libraries(mainexec combinedLib)
就是這樣!
你有靜態版本的庫需要鏈接?或者你只有共享版本? – tpg2114
我有靜態版本 – Rolle
因此,當你說它不包括他們在你的靜態,它試圖鏈接你的靜態庫與其他共享庫? – tpg2114