C++ 如何访问&;使用共享库中定义的字符串

C++ 如何访问&;使用共享库中定义的字符串,c++,dynamic,shared-libraries,ld,C++,Dynamic,Shared Libraries,Ld,我正在尝试将一个版本字符串烘焙到共享库中,但不知道如何在库的客户端程序中访问该字符串 我想使用的方法是:将版本字符串放在文本文件version.txt,使用objcopy将其转换为对象文件,将其链接为。因此并将客户端程序链接到动态共享库 这是我的密码 version.txt 1.2.3.4 test.cpp #include <iostream> extern size_t _binary_version_txt_size; int main() { std::cout <&

我正在尝试将一个版本字符串烘焙到共享库中,但不知道如何在库的客户端程序中访问该字符串

我想使用的方法是:将版本字符串放在文本文件
version.txt
,使用
objcopy
将其转换为对象文件,将其链接为
。因此
并将客户端程序链接到动态共享库

这是我的密码

version.txt

1.2.3.4
test.cpp

#include <iostream>
extern size_t _binary_version_txt_size;
int main() { std::cout << "Size: " << _binary_version_txt_size << std::endl; }
但是,我从链接器中得到以下警告:

/usr/bin/ld: warning: type and size of dynamic symbol `_binary_version_txt_size' are not defined
当程序运行时,符号的错误值被打印出来:

$ LD_LIBRARY_PATH=$(pwd) ./test
Size: 0 <- expected 7
$LD\u LIBRARY\u PATH=$(pwd)。/test
大小:0所以,我找到了“我的方法”但仍然认为Lorinczy的方法更好

我最终放弃了读取字符串大小的尝试,并提出了以下代码:

#define DATASTRING(NAME)                                                 \
  []() -> std::string {                                                  \
    extern char _binary_##NAME##_txt_start[];                            \
    extern char _binary_##NAME##_txt_end[];                              \
    size_t sz = _binary_##NAME##_txt_end - _binary_##NAME##_txt_start; \
    std::string ans(_binary_##NAME##_txt_start, sz);                     \
    ans.pop_back();                                                      \
    return ans;                                                          \
  }()
示例用法

std::string version = DATASTRING(version);
我学到的其他东西:

  • 至少在这个上下文中,
    char[]
    char*
    不同
  • 链接到二进制文件的字符串不是以null结尾的,您需要知道它们的大小或长度

  • 或者:
    cc-DVersion=$(cat version.file).
    怎么说?要讲道理。按我的方式做!感谢您提供这个优雅而简单的解决方案。
    #define DATASTRING(NAME)                                                 \
      []() -> std::string {                                                  \
        extern char _binary_##NAME##_txt_start[];                            \
        extern char _binary_##NAME##_txt_end[];                              \
        size_t sz = _binary_##NAME##_txt_end - _binary_##NAME##_txt_start; \
        std::string ans(_binary_##NAME##_txt_start, sz);                     \
        ans.pop_back();                                                      \
        return ans;                                                          \
      }()
    
    std::string version = DATASTRING(version);