如何使用cmake链接到嵌套静态库

问题描述 投票:0回答:1

我正在开发一个 C 语言项目,其中有一个内部库和一个主程序。内部库依赖于 libjpeg-turbo,main 依赖于内部库。我正在学习 cmake 并尝试使用ExternalProject 功能。

当我将所有内容链接为共享库(libjpeg-turbo 和internal_lib)时,它工作正常。但是当我尝试静态链接它们时,主要失败并显示

undefined reference to jpeg_CreateDecompress
,就好像 libjpeg 未正确链接一样。

这是internal_lib的代码:

CMakeLists.txt

cmake_minimum_required(VERSION 3.9)

project(internal_lib LANGUAGES C)

include(ExternalProject)
ExternalProject_Add(libjpeg-turbo
    GIT_REPOSITORY https://github.com/libjpeg-turbo/libjpeg-turbo.git
    GIT_TAG 6c87537f60941f3c265c339fe60d1e31d2a42ccf # release v3.0.0
    GIT_SHALLOW ON
    INSTALL_COMMAND ""
)

ExternalProject_Get_Property(libjpeg-turbo BINARY_DIR)
set(LIBJPEG_BINARY_DIR "${BINARY_DIR}")
ExternalProject_Get_Property(libjpeg-turbo SOURCE_DIR)
set(LIBJPEG_SOURCE_DIR "${SOURCE_DIR}")

add_library(internal_lib STATIC lib.c)
# add_library(internal_lib SHARED lib.c)

target_include_directories(internal_lib PUBLIC "${LIBJPEG_BINARY_DIR}" "${LIBJPEG_SOURCE_DIR}" ./)
target_link_directories(internal_lib PUBLIC "${LIBJPEG_BINARY_DIR}")

target_link_libraries(internal_lib PUBLIC "${LIBJPEG_BINARY_DIR}/libjpeg.a")
# target_link_libraries(internal_lib PUBLIC jpeg)

lib.c

#include <stdio.h>
#include <jpeglib.h>
#include <lib.h>

int internal_func()
{
    struct jpeg_decompress_struct cinfo;
    jpeg_create_decompress(&cinfo);
    return 0;
}

这是main程序的代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.9)

project(program LANGUAGES C)

include(ExternalProject)
ExternalProject_Add(internal_lib_project
    SOURCE_DIR "../../internal_lib"
    DOWNLOAD_COMMAND ""
    INSTALL_COMMAND ""
)

ExternalProject_Get_Property(internal_lib_project SOURCE_DIR)
set(INTERNAL_LIB_SOURCE_DIR "${SOURCE_DIR}")
ExternalProject_Get_Property(internal_lib_project BINARY_DIR)
set(INTERNAL_LIB_BINARY_DIR "${BINARY_DIR}")

add_executable(main main.c)
target_include_directories(main PUBLIC "${INTERNAL_LIB_SOURCE_DIR}")
target_link_directories(main PUBLIC "${INTERNAL_LIB_BINARY_DIR}")
target_link_libraries(main PUBLIC internal_lib)

main.c

#include <lib.h>

int main()
{
    internal_func();
    return 0;
}

我不明白为什么当我链接到 libjpeg.a 时 libjpeg 不包含在internal_lib中?

我尝试设置

-DENABLE_SHARED=OFF -DENABLE_STATIC=ON
以确保我获得静态 libjpeg 库。

如果我手动将路径添加到

libjpeg.a
中的
target_link_libraries(main, ...)
,它可以工作,但我认为我不应该这样做?如果有必要的话,cmake 有没有办法为我做到这一点?我不知道如何从主程序访问这些“内部”依赖项。

c cmake linker static-libraries
1个回答
0
投票

静态库只不过是目标文件的档案。链接静态库几乎就像链接单个目标文件一样。这意味着,如果一个静态库依赖于另一个库,那么您需要同时链接这两个库。静态库本身没有关于其自身依赖项的信息。

话虽如此,CMake 允许您将依赖项添加到

CMakeLists.txt
文件中的静态库目标,然后处理与这些依赖项的链接。这就是当您对库目标本身使用
target_link_libraries
命令时会发生的情况。您还可以为依赖项设置properties

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.