[英]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.