[英]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
可能需要的所有库,例如: 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 ++符号的名称为mangling 。 因此,您的链接器在libavcodec.a
查找C ++符号,但这些符号不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.