I'm building a project in C++ that requires calling an external library. In particular, I need access to a singleton which is created in a static method of an external class. However, when I try to make it with CMake, I get a linker error:
undefined reference to `AVT::VmbAPI::VimbaSystem::GetInstance()'
I'm sure the path is right, as the code compiles and runs without issue if I don't call GetInstance()
.
The code itself is pretty trivial, so I think this must be an issue with my CMake configuration. The relevant files are below:
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