我一直在将我的项目迁移到使用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)
型
main.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;
};
型
1条答案
按热度按时间7lrncoxx1#
add_compile_definitions
命令添加宏 * 全局 *。用于 * 所有 * 目标。在您的示例中,它将为DLL和应用程序设置。使用
target_compile_definitions
来为单个目标设置宏:字符串
与
link_libraries
类似,它是一个全局命令。使用target_link_libraries
,仅为特定目标设置。