首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ DLL:如何创建相应的include标头?

C++ DLL:如何创建相应的include标头?
EN

Stack Overflow用户
提问于 2021-10-12 15:50:29
回答 2查看 75关注 0票数 2

问题

我有一个C++项目,并从它创建了一个库A。如果我现在将另一个项目B链接到这个库A,我当然还必须为A的头文件提供一个包含路径,所以我只使用A的源文件夹。但是A的头包含不能导出的符号。我觉得这不是正确的方法,但我不知道更好。有一件事让我觉得这是不正确的,那就是我的IDE建议了没有导出的符号。

我猜解决方案是在源文件夹之外创建一个包含文件夹,其中包含相同的头文件,但只包含导出的符号。因此,在构建时,每个包含PROJECTAPI的符号都应该自动复制到include文件夹中相应的头中。但如果我在谷歌上搜索,我找不到这样的函数,例如cmake。

那么这里推荐的方法是什么呢?有没有创建这样一个包含文件夹的功能?

示例

项目B的example.cpp

代码语言:javascript
运行
复制
#include <A/main.hpp>

int main() {
    ex::World w("Earth");
    w.say_hello();
    //IDE wouldn't see this as error: w.private();
}

项目A的main.cpp

代码语言:javascript
运行
复制
#include <iostream>
#include "main.hpp"

namespace ex {
void World::say_hello() {
    std::cout << "Hello, World from " << m_name << std::endl;
}

World::World(std::string name)
    : m_name(name)
{}

void World::hidden() {
    std::cout << "Not exported" << std::endl;
}
}

项目A的main.hpp

代码语言:javascript
运行
复制
#include <string>

#ifndef PROJECTAPI
#  ifdef example_EXPORTS
#    define PROJECTAPI __declspec(dllexport)
#  else
#    define PROJECTAPI __declspec(dllimport)
#  endif
#endif

namespace ex {
class World {
private:
    std::string m_name;
public:
    void PROJECTAPI say_hello();
    PROJECTAPI World(std::string name);
    void hidden();
};
}

编辑: private不是一个好的方法名

EN

Stack Overflow用户

发布于 2021-10-12 16:12:38

通常,解决这个问题的一个简单方法是提前创建单独的公共和私有标头,并且只向用户公开公共标头。

下面是一个简单的项目结构,可以实现这一点:

代码语言:javascript
运行
复制
- lib_a
 - include
   - main.hpp
 - src
   - main_private.hpp
   - main.cpp

显然,这不适用于您发布的代码,因为您想要分隔的声明属于同一个类。但这只是事实的一个征兆,不幸的是,你试图做的事情是不被允许的。

来自标准的

(13.1)类类型(类)可以有多于一个的定义,

..。

程序中的

,条件是每个定义出现在不同的翻译单元中,并且这些定义满足以下要求。

..。

每个这样的定义都应该由相同的标记序列组成...

换句话说,如果你把一个类放在一个公共的头中,它的将与编译库时使用的相同。

尽管这样做很方便,但在公共标头中放入“half class”是不允许的。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69543518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档