使用CMake将错误与静态方法链接

时间:2018-05-31 17:42:00

标签: c++ cmake static-methods

我在C ++中构建一个需要调用外部库的项目。特别是,我需要访问在外部类的静态方法中创建的单例。但是,当我尝试使用CMake创建它时,我收到链接器错误:
undefined reference to `AVT::VmbAPI::VimbaSystem::GetInstance()'
我确定路径是正确的,因为如果我不打电话给GetInstance(),代码会编译并运行没有问题。

代码本身非常简单,所以我认为这必须是我的CMake配置的一个问题。相关文件如下:

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.10 FATAL_ERROR)
PROJECT(Thing LANGUAGES CXX)

#set(CMAKE_VERBOSE_MAKEFILE ON)

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
-Wall -Wextra -Wno-deprecated -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op \
-Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual -Wpedantic \
-ffast-math \
-fPIC \
")

ENABLE_TESTING()

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(lib)
ADD_SUBDIRECTORY(test)

src/CMakeLists.txt

AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} source)

ADD_EXECUTABLE(thing ${source})

TARGET_LINK_LIBRARIES(thing LINK_PUBLIC Camera)

lib/CMakeLists.txt

ADD_LIBRARY(Camera ${CMAKE_CURRENT_SOURCE_DIR}/camera.cpp)

TARGET_INCLUDE_DIRECTORIES(Camera
    PUBLIC
        ../include
        ${CMAKE_CURRENT_SOURCE_DIR}}
        /opt/Vimba_2_0
        /opt/Vimba_2_0/VimbaCPP/Include
)

src/main.cpp

#include <camera.h>

int main() {
    Camera c = Camera();

    return 0;
}

lib/camera.cpp

#include "../include/camera.h"

Camera::Camera() {
    AVT::VmbAPI::VimbaSystem &sys = AVT::VmbAPI::VimbaSystem::GetInstance();
}

include/camera.h

#ifndef CAMERA_H
#define CAMERA_H

#include "VimbaCPP.h"
#include "VimbaSystem.h"

class Camera {
public:
    Camera();
    ~Camera() = default;
};

#endif //CAMERA_H

1 个答案:

答案 0 :(得分:1)

显然,我需要链接一个动态库,这在Vimba文档中没有提到过。对于将来遇到此问题的任何人,我通过将以下行添加到lib/CMakeLists.txt来解决它。

TARGET_LINK_LIBRARIES(Camera /opt/Vimba_2_0/VimbaCPP/DynamicLib/x86_64bit/libVimbaCPP.so)