[英]How to link a 3rd party lib to a static library target in cmake?
我想創建一個這樣的項目:
Foo/
|- libFoo/
|- CMakeLists.txt
|- foo.h
|- foo.cpp
|- libFooTests/
|- CMakeLists.txt
|- test.cpp
|- CMakeLists.txt
# Foo/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Foo)
# I'm on windows, so make sure that all projects are using same runtime library
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd"
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT"
ADD_SUBDIRECTORY(libFoo)
ADD_SUBDIRECTORY(libFooTests)
# Foo/libFoo/CMakeLists.txt
ADD_LIBRARY(libFoo foo.h foo.cpp)
LINK_DIRECTORIES(${THIRD_PARTY_LIB_DIR})
TARGET_LINK_LIBRARIES(libFoo lib3rdparty)
# Foo/libFooTests/CMakeLists.txt
ADD_EXECUTABLE(libFooTests test.cpp)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/libFoo")
TARGET_LINK_LIBRARIES(libFooTests libFoo)
如果我在此設置上運行 cmake,則可以成功生成項目。 但它無法構建,因為生成的項目被配置為將lib3rdparty
鏈接到測試目標libFooTests
而不是libFoo
,當然libFooTests
不知道(也不應該知道)在哪里可以找到lib3rdparty
。
我在 Windows(使用生成器“Visual Studio 12 2013 Win64”)和 Ubuntu(使用生成器“Unix Makefiles”)上都試過了。
${THIRD_PARTY_LIB_DIR}
應該配置為libFoo
目標的庫搜索路徑,而lib3rdparty
應該配置為libFoo
庫輸入libFooTests
只知道在哪里包含libFoo
頭文件(又名${PROJECT_SOURCE_DIR}/libFoo
)和鏈接libFoo
。 它不應該對lib3rdparty
${THIRD_PARTY_LIB_DIR}
似乎被忽略了。 lib3rdparty
為庫輸入libTests
我注意到 Visual Studio 中libFoo.vcxproj
和libFooTests.vcxproj
的Properties Page
對話框略有不同。
前者有一個Configuration Properties | Librarian
Configuration Properties | Librarian
條目而后者有一個Configuration Properties | Linker
Configuration Properties | Linker
代替。
如何鏈接lib3rdparty
到libFoo
唯一?
你不能。
靜態庫不會被鏈接。 靜態庫只是打包成一個文件的一堆目標文件。
當您將它們與完整程序鏈接時,就會發生鏈接。 因此,如果您的靜態庫依賴於另一個庫,您必須將該庫鏈接到使用您的靜態庫的所有程序中。 通過自動執行此操作,CMake 似乎在這里做正確的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.