仅在使用 CMake 时才会对 C++ 20 共享库中的静态成员变量进行未定义引用

问题描述 投票:0回答:1

我一直在迁移我的项目以使用 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;
};
c++ cmake dll shared-libraries
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.