如何在cmake中将第三方库链接到静态库目标

How to link a 3rd party lib to a static library target in cmake?

本文关键字:链接 静态 目标 第三方 cmake      更新时间:2023-10-16

我想创建一个这样的项目:

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一无所知

发生了什么:

CCD_ 15似乎被忽略了。lib3rdpartylibTests的库输入

我注意到:

我注意到visual studio中libFoo.vcxprojlibFooTests.vcxprojProperties Page对话框略有不同。

前者具有Configuration Properties | Librarian条目,而后者具有Configuration Properties | Linker条目。

如何仅将lib3rdparty链接到libFoo

你不能。

静态库不会被链接。静态库只是一堆被打包成一个文件的对象文件。

当你将它们与一个完整的程序链接时,就会发生链接。因此,如果您的静态库依赖于另一个库,则必须将该库链接到使用静态库的所有程序中。CMake在这里似乎自动地做了正确的事情。