Cmake链接静态库与共享库

时间:2014-08-21 09:20:18

标签: c cmake static-linking dynamic-linking

我是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)

我在做这件事的方式有什么可疑的吗?

此致 尼古拉斯

1 个答案:

答案 0 :(得分:2)

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

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

要解决您的问题,您必须添加更多链接库.../ibavcodec.alibavcodec.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 ++符号,但那些不存在。