繁体   English   中英

CMake链接静态库反对共享的一个

[英]Cmake link static lib against shared one

我是CMake的新手,我真的不知道我在做什么……我目前正在尝试将静态库(libavcodec.a)与共享库(GreenVideo)链接。 我一直在说我的静态库提供的功能是“未定义的引用”时出错。 我的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 references 共享库 (.so)不同,静态库不存储有关如何解析这些引用的信息。

实际上, 静态库只是一个弧形文件 ,是对象文件 (.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 ++符号的名称为mangling 因此,您的链接器在libavcodec.a查找C ++符号,但这些符号不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM