我一直在迁移我的项目以使用 CMake,但我偶然发现了静态成员变量的问题。即使 .cpp 文件中有它的定义。
我创建了一个最小的可重现示例。
目录结构:
- dll
- dll.cpp
- dll.h
- main.cpp
- CMakeLists.txt
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
add_compile_definitions(BUILD)
add_library(sharedLib SHARED dll/dll.cpp dll/dll.h)
link_libraries(sharedLib)
add_executable(exec main.cpp)
主.cpp
#include "dll/dll.h"
#include <iostream>
int main( )
{
std::cout << A::member << std::endl;
return 0;
}
dll.cpp
#include "dll.h"
int A::member = 10;
dll.h
#pragma once
#if !defined(BUILD)
#define API __declspec(dllimport)
#else
#define API __declspec(dllexport)
#endif
class API A
{
public:
static int member;
};
add_compile_definitions
命令添加宏全局。对于所有目标。在您的示例中,将为 DLL 和应用程序设置它。
target_compile_definitions
来为单个目标设置宏:
# add_compile_definitions(BUILD)
add_library(sharedLib SHARED dll/dll.cpp dll/dll.h)
target_compile_definitions(sharedLib PRIVATE BUILD)