c++ - 我可以从 C++ 库中包含/导入单个函数吗

标签 c++ linker g++ binutils

我只需要使用 iequals来自 BOOST 库的不区分大小写的字符串比较函数。

我正在使用 #include <boost/algorithm/string.hpp>导入它。

有什么方法可以让我只导入 iequals自己发挥作用?

我什至关心的原因(我真的只是好奇。)是因为如果我不这样做,编译的 DLL 大约是 230kB #include它和大约 1.1MB,如果我这样做的话。在这种特殊情况下,文件有多大并没有太大区别,但似乎有很多东西被导入但从未使用过。如果库只有几 GB 而我只需要其中一个函数怎么办?我想这会成为一个问题。

当谈到几乎所有与 cpp 相关的事情时,我承认我很天真,但我觉得包含大约 750kB 的代码并不是很有效,因为其中可能有 90% 的代码都没有被使用。可能是 iequals函数使用了所有 750kB,我不知道。

再一次,如果 iequals函数包含许多相同的库,文件仍然一样大。

想法?

提前感谢您的任何建议。

编辑:

感谢您的回复。我正在尽我所能去理解它们。

我是一名化学工程师,正在将一堆极其缓慢且优化不佳的 VBA 宏重写为 C++ DLL。到目前为止,结果非常出色,一切正常。如果我只需要在两个字符串之间进行单一类型的比较,我认为不需要额外的文件大小。

我需要做的比较的一个例子如下:

if (SomeBSTR == "SomeTextHere") {
    // do stuff
}

或者更确切地说:

if (Gas == "Methane"    or
    Gas == "CH4"        or
    Gas == "C1")        return 1;

if (Gas == "Ethane"     or
    Gas == "C2H6"       or
    Gas == "C2")        return 2;

如果这是我必须做的唯一比较类型,我可以用比以下更简单的方式来做吗:

int wStrCmp(const BSTR Str1, const wstring Str2) {

    wstring wStr1(Str1, SysStringLen(Str1));

    return boost::iequals(Str1, Str2);
}

通过以下方式调用:

if (wStrCmp(Gas, L"Methane")      or
    wStrCmp(Gas, L"CH4")          or
    wStrCmp(Gas, L"C1"))          return 1; 

最后 2 个 block 实际上是从我的代码中粘贴的。

再次感谢大家。

最佳答案

相信我,您已经只包含了 boost::algorithm::iequals 但它使用了 boost::rangestd::locale可能你没有在代码的其他地方使用它们,所以这会让你的代码变得更大,所以我想对于你的情况没有其他方法可以做到这一点,除非你使用一些非标准函数,比如 stricmp strcasecmp

如果您想在 Windows 上比较宽字符串(例如 BSTR),您可以使用 CRT 中的 _wcsicmp 或 Windows 运行时中的 lstrcmpiW(在 Kernel32.lib 中声明您可能已经与它链接了)。

关于c++ - 我可以从 C++ 库中包含/导入单个函数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092635/

相关文章:

c++ - 使用多线程在 GNU C 中使用 Write Function 是否安全

c++ - 生成 10 到 65 之间的随机数

c++ - 为什么链接器不能防止 C++ 静态初始化顺序失败?

macos - 如何在 Mac 上使用尖括号将 C 库安装为 <mylib.h>

c - DMD:链接到 libc.a?或者 core.simd 信息?

c++ - 为什么使用 fopen 打开流并使用读/写(而不是 fread/fwrite)执行 I/O

c++ - 为什么 C++ 字符串分词器不工作

c++ - 我不明白这个 C++ 模板是如何工作的

c++ - Ubuntu 10.04 需要什么包才能运行用 gcc/g++ 4.7 编译的程序?

c++ - std::chrono 的问题