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

时间:2017-02-14 04:44:14

标签: c++ visual-studio cmake linker

我想要制作一个这样的项目:

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}似乎被忽略了。 lib3rdpartylibTests

的库输入

我注意到了什么:

我注意到Visual Studio中Properties PagelibFoo.vcxproj的{​​{1}}对话框略有不同。

前者有一个libFooTests.vcxproj条目,而后者有一个Configuration Properties | Librarian

如何仅将Configuration Properties | Linkerlib3rdparty关联起来?

1 个答案:

答案 0 :(得分:1)

你不能。

静态库没有链接。静态库只是打包成一个文件的一堆目标文件。

当您将链接与完整程序链接时,会发生链接。因此,如果静态库依赖于另一个库,则必须将该库链接到使用静态库的所有程序中。通过自动执行此操作,CMake似乎在做正确的事。