使用 CMake 的静态方法链接错误

Linking error with static method using CMake

本文关键字:链接 错误 静态方法 CMake 使用      更新时间:2023-10-16

我正在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

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

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