我是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)
我在做这件事的方式有什么可疑的吗?
此致 尼古拉斯
答案 0 :(得分:2)
您的静态库显然有一些undefined references
。与共享库(.so)不同,静态库不存储有关如何解析这些引用的信息。
事实上,静态库只是一个arcive,是 objecf文件(.o)的集合。
要解决您的问题,您必须添加更多链接库.../ibavcodec.a
。 libavcodec.a
可能需要的所有库,例如:c
,stdc++
,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 ++符号,但那些不存在。