仅当使用CMake时,C++ 20共享库中对静态成员变量的未定义引用

11dmarpk  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(119)

我一直在将我的项目迁移到使用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;
};

7lrncoxx

7lrncoxx1#

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)

字符串
link_libraries类似,它是一个全局命令。使用target_link_libraries,仅为特定目标设置。

相关问题