【问题标题】:How to link a 3rd party lib to a static library target in cmake?如何将第 3 方库链接到 cmake 中的静态库目标?
【发布时间】:2017-02-14 04:44:13
【问题描述】:

我想做一个这样的项目:

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 不知道(也不应该知道)在哪里可以找到@987654326 @。

我在 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 | Linker。

如何将lib3rdparty 仅链接到libFoo?

【问题讨论】:

    标签: c++ visual-studio cmake linker


    【解决方案1】:

    你不能。

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

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

    【讨论】:

    • 我明白了。有什么方法可以实现类似的东西吗?制作libFoo共享等。
    • 鉴于“静态库未链接”,这里最合适的方法可能是让libFooTests 知道在哪里可以找到那些从libFoo“继承”的库。将LINK_DIRECTORIES 放入libFooTests/CMakeLists.txt 会起作用,但这样做真的很讨厌。我怎样才能让LINK_DIRECTORIES 也被“继承”到libFooTests ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多