在 CMake 中链接外部预建库 [重复]

Posted

技术标签:

【中文标题】在 CMake 中链接外部预建库 [重复]【英文标题】:Linking an external pre-built library in CMake [duplicate] 【发布时间】:2020-08-28 13:05:27 【问题描述】:

我正在构建一个使用项目范围之外的库的项目。我对 CMake 比较陌生,我似乎无法构建这个库。我的代码如下:

    cmake_minimum_version(VERSION 3.1) 
    
    project(cameraCode VERSION 1.0.0)
    add_library(camControl SHARED IMPORTED
                /opt/MVS/lib/64/MVCamControl
                /opt/MVS/include/MvCamControl.h)
    add_executable($PROJECT_NAME cameraCode.cpp)
    
    target_link_libraries($PROJECT_NAME 
                PRIVATE
                camControl)

当我做这个时,它配置得很好,但是当我构建它时,我得到这个错误: make[2] *** 没有规则来制作“cameraCode”需要的目标“camControl-NOTFOUND”。停下来。

【问题讨论】:

/opt/MVS/lib/64/MVCamControl 下有哪些文件? 这是我试图包含的 .so 文件的完整路径 它怎么可能是“.so 文件的完整路径”但不以“.so”结尾?那个目录下有libMVCamControl.so吗? 对,就是.so文件所在的地方 那么.so文件叫什么? 【参考方案1】:

add_library 表示您正在构建库。

认为 add_library 是你想要的,如果这是你所说的预建库。

看起来您只需要 link_directoriesinclude_directories 就可以让客户端找到库和头文件。

【讨论】:

我刚刚尝试过,现在我得到了这个:/usr/bin/ld: 找不到 -lcamControl 您必须检查文档以了解正确的语法 这就是我现在拥有的: find_library(MvCamControl /opt/MVS/lib/64/ /opt/MVS/include/ REQUIRED) add_executable($PROJECT_NAME cameraCode.cpp) target_link_libraries( $ PROJECT_NAME PUBLIC MvCamControl ) MvCamControl 是库的名称,库本身的路径在下面,头文件的路径在下面。【参考方案2】:

IMPORTED 库您是对的,但您需要 set some properties 而不是将文件作为 add_library 的一部分传递:

add_library(camControl SHARED IMPORTED)
set_target_properties(camControl PROPERTIES
    IMPORTED_LOCATION /opt/MVS/lib/64/MVCamControl/libMVCamControl.so
    INTERFACE_INCLUDE_DIRECTORIES /opt/MVS/include/
)

【讨论】:

好的,我试过了,我得到这个错误:/usr/bin/ld: 找不到 -lMvCameraControl 在 /opt/MVS/lib/64/MVCamControl/ 中是否有 libMvCameraControl.so?使用 make VERBOSE=1 显示完整的链接器命令行 这是我现在得到的错误:没有规则来制作目标'/opt/MVS/lib/64/libMVCameraControl.so',需要'cameraCode'。停止。 我现在第五次问了:'/opt/MVS/lib/64/'下的.so文件叫什么名字? 它是 MvCameraControl.so

以上是关于在 CMake 中链接外部预建库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 中链接预编译库?

CMake 链接到外部库

注册。使用 CMake 将外部库链接到项目

CMake - 如何链接到我的项目打包的外部库?

cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接

如何在cmake中添加链接器目录? [重复]