簡體   English   中英

如何將第 3 方庫鏈接到 cmake 中的靜態庫目標?

[英]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.vcxprojlibFooTests.vcxprojProperties Page對話框略有不同。

前者有一個Configuration Properties | Librarian Configuration Properties | Librarian條目而后者有一個Configuration Properties | Linker Configuration Properties | Linker代替。

如何鏈接lib3rdpartylibFoo唯一?

你不能。

靜態庫不會被鏈接。 靜態庫只是打包成一個文件的一堆目標文件。

當您將它們與完整程序鏈接時,就會發生鏈接。 因此,如果您的靜態庫依賴於另一個庫,您必須將該庫鏈接到使用您的靜態庫的所有程序中。 通過自動執行此操作,CMake 似乎在這里做正確的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM