我想这样的一个项目:

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)的 header ,并链接libFoo。它应该对lib3rdparty一无所知
发生了什么事:${THIRD_PARTY_LIB_DIR}似乎被忽略了。lib3rdpartylibTests的库输入
我注意到的是:
我注意到Visual Studio中的Properties PagelibFoo.vcxprojlibFooTests.vcxproj对话框略有不同。
前者具有Configuration Properties | Librarian条目,而后者具有Configuration Properties | Linker条目。
如何将lib3rdparty仅链接到libFoo

最佳答案

你不能

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

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

关于c++ - 如何在cmake中将第三方库链接到静态库目标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42218025/

10-13 02:36