【问题标题】:libavcodec.a(vc1dsp_mmx.o): relocation R_X86_64_PC32 against symbol `ff_pw_9'libavcodec.a(vc1dsp_mmx.o):针对符号“ff_pw_9”重定位 R_X86_64_PC32
【发布时间】:2019-01-02 22:10:30
【问题描述】:

我正在 ubuntu(vagrant) 中构建一个使用 ffmpeg 库(libavcodec.a、libavformat.a、libavutil.a)的共享对象文件。我首先使用标准配置选项从trac.ffmpeg 构建ffmpeg 和库。但是动态链接存在一些问题,我稍微修改了配置选项以添加--enable-shared-fPIC 选项。

However when I build my application I get 
/usr/bin/ld: /root/ffmpeg_build/lib/libavcodec.a(vc1dsp_mmx.o): 
relocation R_X86_64_PC32 against symbol `ff_pw_9' can not be used when
 making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

我在配置中使用了以下选项来构建 ffmpeg

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:$PKG_CONFIG_PATH" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include -fPIC" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib -Wl,-Bsymbolic" \
  --extra-libs="-lpthread -lm" \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree \
  --enable-pic \
  --enable-shared

构建在我的 MAC 上运行良好。

以下是我构建应用程序的 cmake 文件

cmake_minimum_required(VERSION 3.5)
project(extractor C)

set(CMAKE_C_STANDARD 99)

set(EXECUTABLE_NAME "extractor")

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)

set(EXTRACTOR_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(target_dir "bin")

# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -std=99")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
# set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")


add_library(${EXECUTABLE_NAME} SHARED src/frame_extractor.c)

include_directories(".")
find_package(FFmpeg REQUIRED)

if (FFMPEG_FOUND)
    message("Found FFMPEG/LibAV libraries ${FFMPEG_LIBRARIES}")
        message("include dirs ${FFMPEG_INCLUDE_DIR}")
    include_directories(${FFMPEG_INCLUDE_DIR})
    target_link_libraries(${EXECUTABLE_NAME} ${FFMPEG_LIBRARIES})
else (FFMPEG_FOUND)
    message("cant find libavcodec, libavformat or libavutil. add them manually!!")
endif (FFMPEG_FOUND)

target_link_libraries(${EXECUTABLE_NAME} ${FFMPEG_LIBRARIES})
# target_link_libraries (${EXECUTABLE_NAME} "-lm")
# target_link_libraries (${EXECUTABLE_NAME} "-lavcodec")

if(APPLE)
    #target_link_libraries(${EXECUTABLE_NAME} "-framework CoreServices")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework CoreFoundation")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework AudioToolbox")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework VideoToolbox")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework CoreAudio")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework CoreMedia")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework CoreVideo")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework AVFoundation")
    #target_link_libraries(${EXECUTABLE_NAME} "-framework Security")
    #target_link_libraries(${EXECUTABLE_NAME} /usr/lib/libbz2.1.0.dylib)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/lib/libz.1.dylib)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/lib/libiconv.dylib)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/lib/liblzma.dylib)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/local/lib/libswresample.a)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/local/Cellar/fdk-aac/0.1.6/lib/libfdk-aac.dylib)
    #target_link_libraries(${EXECUTABLE_NAME} /usr/local/lib/libx264.dylib)
endif(APPLE)
# Add python dependencies -
# ERROR - It picks up the default version from the machine which is 2.7.10
find_package( PythonInterp 2.7 REQUIRED)
find_package(PythonLibs 2.7 REQUIRED)


message("GURU - python include dirs = ${PYTHON_INCLUDE_DIRS}")
message("GURU - python include dirs = ${PYTHON_LIBRARIES}")

include_directories(${PYTHON_INCLUDE_DIRS})
target_link_libraries(${EXECUTABLE_NAME} ${PYTHON_LIBRARIES})



# Apple creates annoying dylib extension for shared libraries
if(APPLE)
    SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
endif(APPLE)
set(CMAKE_SHARED_LIBRARY_PREFIX "")

非常感谢您为解决此问题提供的任何帮助。

【问题讨论】:

  • .a 文件不是动态库(即 .so),它们是静态库。您是否尝试在动态库中包含静态库?或者您是否链接了错误的库(您是否忘记在重建共享的 .so 文件后删除 .a 文件)?
  • 太棒了!非常感谢@RonaldS.Bultje。我只是假设 cmake 选择了正确的。一旦我删除了 .a 文件,它就会自动拾取 .so 文件。
  • 万一有人偶然发现这里链接 static ffmpeg,请确保将 -Wl,-Bsymbolic-fPIC 一起添加到链接标志。
  • 如果这里用于 OpenCV,请参阅 askubuntu.com/questions/1292968/…

标签: gcc ffmpeg ubuntu-16.04 libavcodec


【解决方案1】:

我遇到了同样的问题。有趣的是,您自己的 CMakeLists.txt 为我指出了答案。

取消注释

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多