【问题标题】:gcc link single library from custom path but not othersgcc 从自定义路径链接单个库,但不链接其他库
【发布时间】:2021-05-25 21:01:13
【问题描述】:

我正在为 Raspberry Pi 编写一个自定义视频播放器,它使用 ffmpeg 解码视频,并在 GDB 和 DRM 之上使用 OpenGL 来渲染它。

要在 Raspberry Pi 上解码视频,必须在启用 MMAL 的情况下编译 ffmpeg,因为这是硬件加速视频解码的推荐 API。

问题:

几乎所有的库都位于标准路径中,除了 MMAL,它位于 /opt/vc/lib/libmmal.so

当然,大家首先想到的是,加-L/opt/vc/lib就行了,但没那么简单:

  • 我还在我的程序中使用/usr/lib/libEGL.so,由 Mesa 提供。
  • 还有我不想使用的 /opt/vc/lib/libEGL.so,因为它是不适合我的情况的旧版实现。

如果我添加-L/opt/vc/lib,它将优先考虑该路径并选择错误的库/opt/vc/lib/libEGL.so

有没有办法做类似-L/opt/vc/lib 的事情,但只针对一个特定的库,而对于其他库,它继续使用标准路径?或者有没有其他方法可以解决这个问题?

我尝试了-l/opt/vc/lib/libmmal.so 之类的方法,但没有奏效,我找不到太多帮助,因为这是一个非常具体的问题。

任何人都知道如何在 CMake 中做同样的事情。

【问题讨论】:

  • @Devolus 这不是我要处理的。我知道如何处理其他地方的图书馆。在这种情况下,那个人想要指定一个库的自定义路径,但是一旦他这样做了,就没有其他库会突然开始从同一个新位置链接。那是我的问题。我可以从自定义位置链接一个库,但随后更多库开始从该新位置链接,我不希望这样。
  • 你不能将构建过程分成两个独立的子项目,一个获取一个路径,另一个获取普通库吗?
  • @Devolus 我不确定我该怎么做。我的项目由几个 .c 文件组成,它们链接到一个可执行文件中。在编译可执行文件后,在链接部分出现问题。你会怎么做?
  • 当使用像/opt/vc/lib/libmmal.so这样的绝对路径时,不要在它前面加上-l

标签: c gcc linker shared-libraries ld


【解决方案1】:
src
   Library
       CMakeLists.txt
       lib_main.cpp
   MainProject
       main.cpp
   CMakeLists.txt
CMakeLists.txt

src:CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(MainProject)
add_subdirectory(Library)

src/Library:CMakeLists.txt

project(MyLibrary)

set(TARGET ${PROJECT_NAME})

set(SOURCES
    lib_main.cpp
)

# additional library paths
link_directories( /usr/local/lib64 )

add_library(${TARGET} SHARED ${SOURCES})

src/MainProject:CMakeLists.txt 项目(主项目)

set(TARGET ${PROJECT_NAME})

set(SOURCES
    main.cpp
)

# Target to build
add_executable(${TARGET} ${SOURCES})

### Library linking
target_link_libraries(${TARGET}
    MyLibrary
)

【讨论】:

  • 但这仅适用于我既是库的创建者又是链接该库的可执行文件的情况。但这不是我的情况。我正在链接多个第三方共享库,其中一个位于自定义位置。
  • 您不能将可执行文件与两个不同的库链接,导出相同的符号。如果您需要该库,则必须将其放入单独的二进制文件(即 sahred 库,它可以在其中使用该函数)并链接到它。如果您在可执行文件中链接目标文件,那么我看不出您如何告诉链接器您只想对那个实例使用符号。
  • 我不想用相同的符号链接 2 个不同的库。请再次阅读我原来的问题。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多