我在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
答案 0 :(得分:1)
显然,我需要链接一个动态库,这在Vimba文档中没有提到过。对于将来遇到此问题的任何人,我通过将以下行添加到lib/CMakeLists.txt
来解决它。
TARGET_LINK_LIBRARIES(Camera /opt/Vimba_2_0/VimbaCPP/DynamicLib/x86_64bit/libVimbaCPP.so)