【问题标题】:Cmake link static lib against shared oneCmake链接静态库对共享一个
【发布时间】:2014-08-21 09:20:18
【问题描述】:

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

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

问候, 尼古拉斯

【问题讨论】:

    标签: c cmake static-linking dynamic-linking


    【解决方案1】:

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

    其实静态库只是一个arive,一个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++ 符号,但这些符号不存在。

    【讨论】:

    • 嗯,我得到的唯一错误消息是这个:CMakeFiles/GreenVideo.dir/metadatagen.cpp.o: In function CMetaDataGen::AVC_parser(unsigned char*, unsigned int)': metadatagen.cpp:(.text+0x4e0): undefined reference to av_init_packet(AVPacket*)' collect2: ld returned 1 exit status make[2]: *** [components/GreenVideo/lib/libGreenVideo.so] 错误 1 ​​所以我猜 CMake 无法找到库(ibavcodec.a)。否则,它将要求标准 c 库....我打开了 link.txt 文件,该文件收集了有关链接标志的所有信息。
    • 谢谢!我不知道您是如何看到这一点的,但这就是解决方案!问候,尼古拉斯
    • @SyfIllis 你可以从av_init_packet(AVPacket*) 看到这个。这显然是函数的 C++ 签名,因为它包含类型 (AVPacket*)。
    • 有道理!谢谢!
    猜你喜欢
    • 2015-10-08
    • 2012-07-29
    • 2020-12-17
    • 2020-04-27
    • 2018-03-18
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多