![](/img/trans.png)
[英]does the linker includes whole library to .exe file or only the functions used in program from that library?
[英]Separating Library Includes From Program Using Library
我正在创建一个DLL库,它将导出一些要在其他C ++项目中使用的功能。 在我的库中,我使用的是预编译头文件以及Boost ASIO。 但是,我想知道是否有可能在库本身中包含所有与ASIO相关的内容,以便其他程序不需要包含它们。 例如:
stdafx.h(库):
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <WinSock2.h>
#include <iostream>
#include <string.h>
#pragma comment(lib, "ws2_32")
#include <boost/asio.hpp>
Client.h(库):
#pragma once
#ifdef LIB_EXPORTS
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __declspec(dllimport)
#endif
using boost::asio::ip::tcp;
namespace TestLib {
class Client {
boost::asio::io_service io_service_;
tcp::resolver resolver_;
tcp::socket socket_;
public:
LIB_API Client();
LIB_API bool Connect(const std::string& szHost, const std::string& szPort);
virtual ~Client();
};
}
但是,在使用该库的程序中,我希望能够包含Client.h而不必包含Boost ASIO。 因为我包含了此标头,但没有包含Boost ASIO,所以我在Client.h中遇到了所有引用Boost工具的行的错误,例如using语句和三个私有成员变量。
我如何以这种方式创建库,例如,我的其他程序仅需要包含Client.h?
我已经使用Anon Mail的建议解决了我的问题。 解决方法如下:
Client.h(库):
#pragma once
#ifdef LIB_EXPORTS
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __declspec(dllimport)
#endif
namespace TestLib {
class Client {
struct Imp;
std::unique_ptr<Imp> imp_;
public:
LIB_API Client();
LIB_API bool Connect(const std::string& szHost, const std::string& szPort);
LIB_API virtual ~Client();
};
}
Client.cpp(库):
namespace TestLib {
struct Client::Imp {
Client::Imp() :
io_service_(new boost::asio::io_service()),
resolver_(new tcp::resolver(*io_service_)),
socket_(new tcp::socket(*io_service_)) {
}
std::shared_ptr<boost::asio::io_service> io_service_;
std::shared_ptr<tcp::resolver> resolver_;
std::shared_ptr<tcp::socket> socket_;
};
Client::Client() : imp_(new Imp) {
}
bool Client::Connect(const std::string& szHost, const std::string& szPort) {
tcp::resolver::query query(szHost, szPort);
tcp::resolver::iterator endpoint_iter = imp_->resolver_->resolve(query);
boost::asio::connect(*imp_->socket_, endpoint_iter);
return true;
}
}
如果我使用了错误类型的指针,请原谅我。 此解决方案的任何指导将不胜感激!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.