使用我的 dylib 中的 std::string 参数调用成员函数会产生 "Undefined symbols" 错误
Calling member functions with std::string params from my dylib creates "Undefined symbols" errors
当尝试使用我用 Xcode 6.3.2 构建的动态库 link 时,我对具有 std::string 参数的 class 函数的所有调用都被拒绝到 link:
Undefined symbols for architecture x86_64:
“MyClass::Bogus(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)”,…
包含 dylib 的 .h 文件,public class 成员的原型为:
int Bogus(std::string& aStringRef, bool verbose);
有趣的是,如果我将第一个 std::string 参数的类型更改为 long(并使用 long 作为第一个参数调用它),则不会出现 link 错误。所以我知道我肯定 link 使用我构建的 dylib。
对于我的 dylib,Apple LLVM 6.1 C++ 标准库设置为默认值 (libstdc++)。
我进行调用的代码本身就是一个 .dylib,正在编译和 linked 不是来自 Xcode,而是完全来自 makefile。用于从该 makefile 编译的 c++ 版本是:
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
我觉得可疑的一件事是调用代码是使用“-std=c++1y”编译的,它可能使用了 C++14 的标准库。两者之间是否存在冲突?标准库正在 link 使用我选择的用于构建 dylib 的调用程序编辑标准库?(我的 dylib 代码正在使用编译器方言 = GNU++98 编译)
很难在不同的二进制模块之间传递标准库对象,因为它们的二进制表示和实现细节不标准化。
要使其正常工作,您需要确保所有模块都使用相同的 - 并且可能是相同版本的 - 编译器、标准库实现和所有相关编译设置(异常、迭代器调试、等)...这基本上违背了首先拥有动态库的目的。
传递数据时,您应该坚持使用简单的指针(c 字符串、数据缓冲区)或引入一些自定义的、更透明的数据类型。
具体解决办法见以下答案:
Passing std::string in a library API
Passing reference to STL vector over dll boundary
当尝试使用我用 Xcode 6.3.2 构建的动态库 link 时,我对具有 std::string 参数的 class 函数的所有调用都被拒绝到 link:
Undefined symbols for architecture x86_64:
“MyClass::Bogus(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)”,…
包含 dylib 的 .h 文件,public class 成员的原型为:
int Bogus(std::string& aStringRef, bool verbose);
有趣的是,如果我将第一个 std::string 参数的类型更改为 long(并使用 long 作为第一个参数调用它),则不会出现 link 错误。所以我知道我肯定 link 使用我构建的 dylib。
对于我的 dylib,Apple LLVM 6.1 C++ 标准库设置为默认值 (libstdc++)。
我进行调用的代码本身就是一个 .dylib,正在编译和 linked 不是来自 Xcode,而是完全来自 makefile。用于从该 makefile 编译的 c++ 版本是:
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
我觉得可疑的一件事是调用代码是使用“-std=c++1y”编译的,它可能使用了 C++14 的标准库。两者之间是否存在冲突?标准库正在 link 使用我选择的用于构建 dylib 的调用程序编辑标准库?(我的 dylib 代码正在使用编译器方言 = GNU++98 编译)
很难在不同的二进制模块之间传递标准库对象,因为它们的二进制表示和实现细节不标准化。
要使其正常工作,您需要确保所有模块都使用相同的 - 并且可能是相同版本的 - 编译器、标准库实现和所有相关编译设置(异常、迭代器调试、等)...这基本上违背了首先拥有动态库的目的。
传递数据时,您应该坚持使用简单的指针(c 字符串、数据缓冲区)或引入一些自定义的、更透明的数据类型。
具体解决办法见以下答案:
Passing std::string in a library API
Passing reference to STL vector over dll boundary