问题
我有一个C++项目,并从它创建了一个库A。如果我现在将另一个项目B链接到这个库A,我当然还必须为A的头文件提供一个包含路径,所以我只使用A的源文件夹。但是A的头包含不能导出的符号。我觉得这不是正确的方法,但我不知道更好。有一件事让我觉得这是不正确的,那就是我的IDE建议了没有导出的符号。
我猜解决方案是在源文件夹之外创建一个包含文件夹,其中包含相同的头文件,但只包含导出的符号。因此,在构建时,每个包含PROJECTAPI的符号都应该自动复制到include文件夹中相应的头中。但如果我在谷歌上搜索,我找不到这样的函数,例如cmake。
那么这里推荐的方法是什么呢?有没有创建这样一个包含文件夹的功能?
示例
项目B的example.cpp
#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
#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
#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不是一个好的方法名
发布于 2021-10-12 16:12:38
通常,解决这个问题的一个简单方法是提前创建单独的公共和私有标头,并且只向用户公开公共标头。
下面是一个简单的项目结构,可以实现这一点:
- lib_a
- include
- main.hpp
- src
- main_private.hpp
- main.cpp显然,这不适用于您发布的代码,因为您想要分隔的声明属于同一个类。但这只是事实的一个征兆,不幸的是,你试图做的事情是不被允许的。
来自标准的
(13.1)类类型(类)可以有多于一个的定义,
..。
程序中的
,条件是每个定义出现在不同的翻译单元中,并且这些定义满足以下要求。
..。
每个这样的定义都应该由相同的标记序列组成...
换句话说,如果你把一个类放在一个公共的头中,它的的将与编译库时使用的相同。
尽管这样做很方便,但在公共标头中放入“half class”是不允许的。
https://stackoverflow.com/questions/69543518
复制相似问题