首页 > 解决方案 > 无法使用 cmake link_directories 找到目标文件

问题描述

我想在链接过程中添加几个 .o 文件。如果我这样做:

TARGET_LINK_LIBRARIES(FFMPEGTest stdc++fs -pthread /home/stiv2/jsoft/nv-ffmpeg/ffmpeg/libswresample/audioconvert.o ...some more stuff... )

然后它找到文件。所有这些文件都在同一个目录中,所以我想同时添加它们:

link_directories(/home/stiv2/jsoft/nv-ffmpeg/ffmpeg/libswresample/)
TARGET_LINK_LIBRARIES(FFMPEGTest stdc++fs -pthread audioconvert.o ...some more stuff... )

但这不起作用:

/usr/bin/ld: cannot find -laudioconvert.o

我该如何解决?

标签: objectgcccmakeld

解决方案


文档target_link_libraries不允许相对路径( audioconvert.o) 作为该命令的参数。它应该是绝对路径( /home/stiv2/jsoft/nv-ffmpeg/ffmpeg/libswresample/audioconvert.o) 或纯库名称(如zlibz.a)。

因为目标文件audioconvert.o不是库,所以不能用普通的库名来指定。除了为目标文件指定绝对路径外,您别无选择。

要在某个目录中指定多个目标文件,您可以使用foreach循环:

foreach(obj audioconvert.o foo.o bar.o)
  target_link_libraries(FFMPEGTest /home/stiv2/jsoft/nv-ffmpeg/ffmpeg/libswresample/${obj})
endforeach()

实际上,看起来不像绝对路径(并且不对应于库目标<param>)的每个参数都被转换为链接器的选项。target_link_libraries-l<param>

链接器将此参数解释为普通库名,并在链接目录中搜索名为lib<param>.aor的文件。lib<param>.so

因此,-laudioconvert.o链接器使用参数搜索具有名称的文件libaudioconvert.o.a- 显然,这不是您想要的。


推荐阅读