如何在cmake中链接共享对象

How to link shared object in cmake?

本文关键字:链接 共享 对象 cmake      更新时间:2023-10-16

如何在cmake中链接共享对象到我自己的代码?
我想链接OpenCV,我的意思是libopencv_***.so.3.1或类似的东西到我自己的软件包。

在这种情况下,我相信以下几行是这个问题的答案。

...
find_package(OpenCV 3.1)
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIBRARY_DIRS})
...
target_link_libraries(my_node ${OpenCV_LIBRARIES})

但是,这里有一个问题。我之前在/usr/include和/usr/lib/x86_64-linux-gnu下安装了OpenCV 2.4.8,现在我想从代码中使用安装在本地目录"~/Libs/OpenCV"中的OpenCV 3.1.0。因此,在编译代码时,OpenCV 2.4.8优先使用。

在这种情况下,我应该如何描述CMakeLists.txt ?
目前我是这样写的:

...
set(CMAKE_PREFIX_PATH ${HOME}/Libs/opencv)
include(${HOME}/Libs/opencv/share/OpenCV/OpenCVConfig.cmake)
find_package(OpenCV 3.1)
set(OpenCV_INCLUDE_DIRS ${HOME}/Libs/opencv/include)
include_directories(${OpenCV_INCLUDE_DIRS)
set(OpenCV_LIBRARY_DIRS ${HOME}/Libs/opencv/lib)
link_directories(${OpenCV_LIBRARY_DIRS})
...

上面的CMakeLists.txt对我有点帮助。
如果将可执行文件复制到libopencv_***.so.3.1所在的目录,则上述CMakeLists.txt有效。
否则,"make"将失败。但是我想让它独立于包含可执行文件的目录。

这个问题我该怎么做?

参见cmake的find_library文档。一些预定义的路径用于搜索库。(依赖于平台)。可以通过选项禁用此功能。试一试find_package(OpenCV 3.1 PATHS ~/Libs/opencv NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH)