gpt4 book ai didi

Cmake 将静态库链接到共享库

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:55 25 4
gpt4 key购买 nike

我是 CMake 的新手,我真的不知道我在做什么......我目前正在尝试将静态库 (libavcodec.a) 链接到共享库 (GreenVideo)。我一直有错误说我的静态库提供的函数是“ undefined reference ”。我的 CMakeLists.txt 看起来像这样:

PROJECT(GreenVideo)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/)

link_directories(/home/nde/svn/Visio/trunk/applications/dorsalistaApp/components/GreenVideo/lib)


ADD_LIBRARY( GreenVideo SHARED
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/xvmc.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/vdpau.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/dxva2.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/avcodec.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/avfft.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/dv_profile.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/vaapi.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/vda.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libavcodec/version.h

metadatagen.h metadatagen.cpp

greenvideofactory.h
greenvideofactory.cpp
)



target_link_libraries(GreenVideo /home/nde/svn/Visio/trunk/applications/dorsalistaApp/components/GreenVideo/lib/libavcodec.a)

我这样做有什么可疑之处吗?

问候,尼古拉斯

最佳答案

您的静态库 显然有一些 undefined reference 。与共享库 (.so) 不同,静态库不存储有关如何解析这些引用的信息。

事实上,static library只是一个arcive,是objecf文件(.o)的集合。

要解决您的问题,您必须在 .../ibavcodec.a 之后添加更多链接库。 libavcodec.a可能需要的所有库,例如:cstdc++rt等。 .

编辑:

好的,看来我解决了你的问题。这与您链接库的方式无关,而是因为您包含 libavcodec 的头文件的方式。

包含头文件的地方如下:

#include <libavcodec/avcodec.h>

你必须做

extern "C" {
#include <libavcodec/avcodec.h>
}

您还可以将多个包含包装在一个 extern "C"{ ... } 中,例如:

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/common.h>
...
}

有什么问题? C++ 符号有 name mangling .因此,您的链接器会在 libavcodec.a 中查找 C++ 符号,但它们并不存在。

关于Cmake 将静态库链接到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25422625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com