Visual Studio 如何创建一个既可以导出又可以使用类示例的Windows DLL

0wi1tuuw  于 2023-10-23  发布在  Windows
关注(0)|答案(1)|浏览(213)

文件F1.h是

  1. enum class E { A, B, C };
  2. template<class E> class X {
  3. public: X(const E& y) { self.z = y; }
  4. };
  5. __declspec(dllexport) X<E> foo; // Attempt to declare but not instantiate

文件F1.cpp是

  1. #include <F1.h>
  2. __declspec(dllexport) X<E> foo(E.A); // Attempt to instantiate matching .H declaration

文件F2.cpp是

  1. #include <F1.h>
  2. void f()
  3. {
  4. E z = foo.z; // Attempt to use from declaration without instantiating
  5. }

Visual Studio C++项目P具有F1.cpp和F2.cpp。构建这个项目会给LNK2005错误,F1.obj中的foo已经在F2.obj中定义了。
有没有一种方法可以设置它,使foo从F1.obj导出到P.DLL中,并在F2.cpp中可用,而不是在F2.obj中定义?

3zwjbxry

3zwjbxry1#

在你的例子中有未定义的变量。
下面是一个示例:
F1.h

  1. #pragma once
  2. #ifdef MYDLL_EXPORTS
  3. #define MYDLL_API __declspec(dllexport)
  4. #else
  5. #define MYDLL_API __declspec(dllimport)
  6. #endif
  7. enum class E { A, B, C };
  8. template<class E>
  9. class X
  10. {
  11. public:
  12. X(const E& y) { this->Z = y; }
  13. E Z;
  14. };
  15. extern MYDLL_API X<E> foo;
  16. MYDLL_API void f();

F1.cpp

  1. #include "F1.h"
  2. X<E> foo(E::B);

F2.cpp

  1. #include<iostream>
  2. #include "F1.h"
  3. void f()
  4. {
  5. E z = foo.Z;
  6. std::cout << (int)z;
  7. }

并测试项目main.cpp

  1. #include <iostream>
  2. #include"../F1.h"
  3. int main()
  4. {
  5. std::cout <<(int) foo.Z<<std::endl;
  6. f();
  7. }

输出

  1. 1
  2. 1
展开查看全部

相关问题