我正在开发一个 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 有没有办法为我做到这一点?我不知道如何从主程序访问这些“内部”依赖项。
静态库只不过是目标文件的档案。链接静态库几乎就像链接单个目标文件一样。这意味着,如果一个静态库依赖于另一个库,那么您需要同时链接这两个库。静态库本身没有关于其自身依赖项的信息。
话虽如此,CMake 允许您将依赖项添加到
CMakeLists.txt
文件中的静态库目标,然后处理与这些依赖项的链接。这就是当您对库目标本身使用 target_link_libraries
命令时会发生的情况。您还可以为依赖项设置properties。