我正在使用 CMake 编译静态库。我有“轨道”课程。
在 .h 文件中是这样声明的:
class Track {
private:
static int _id_counter;
int _id;
TrackInfo _info;
public:
Track();
Track(TrackInfo &info);
Track(const Track &t) = default;
};
和.cpp:
#include "Track.h"
int Track::_id_counter = 0;
Track::Track() : _info(), _id(++_id_counter) {}
Track::Track(TrackInfo &info) : _info(info), _id(++_id_counter) {}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.23)
set(project "database")
project(${project})
set(CMAKE_CXX_STANDARD 17)
set(${project}_SOURCES Track.cpp)
set(${project}_HEADERS Track.h)
set(${project}_SOURCE_LIST
${${project}_SOURCES}
${${project}_HEADERS})
add_library(${project}
STATIC
${${project}_SOURCE_LIST})
问题是CMake只使用头文件编译静态库,没有cpp。所以,当我使用这个库时,我有错误:
undefined reference to
Track::Track(TrackInfo&)'`
如果我在标头中实现构造函数,我会得到对 _id_counter 的未定义引用
例如:
#include "Track.h"
...
TrackInfo info;
Track track(info);
...
我尝试包含 Track.cpp 并且它以这种方式工作正常。但我认为这不是一个好方法 =)