iOS Swift调用C++代码时出现重复符号错误的解决求助
首先咱们来揪出问题的核心根源:你在NativeLibWrapper.mm里直接导入了NativeLib.cpp源文件,这是导致重复符号错误的关键原因!
当你在.mm文件里执行#import "NativeLib.cpp"时,Xcode会把cpp文件的内容直接嵌入到mm文件中一起编译,同时NativeLib.cpp本身作为单独的源文件也会被编译一次。这样一来,NativeLib::sayHello(bool)这个函数就被定义了两次,链接器自然会抛出重复符号的报错。
至于为什么去掉std::to_string(bool)就能编译?这只是编译器的巧合优化——当函数实现足够简单时,编译器可能会自动把它标记为inline,让两次定义的符号被合并,暂时绕过了错误,但这绝对不是正确的解决方式,后续很可能再出问题。
正确的解决步骤(保留原cpp内容):
修正NativeLibWrapper.mm的导入语句
把#import "NativeLib.cpp"替换成#import "NativeLib.hpp"——源文件(.cpp)永远不应该被导入,头文件(.hpp)才是用来暴露类和函数接口的正确文件。修改后的NativeLibWrapper.mm如下:#import <Foundation/Foundation.h> #import "NativeLibWrapper.h" #import "NativeLib.hpp" // 替换为导入头文件 @implementation NativeLibWrapper - (NSString *) sayHello: (bool) boolTest { NativeLib nativeLib; std::string retour = nativeLib.sayHello(boolTest); return [NSString stringWithCString: retour.c_str() encoding: NSUTF8StringEncoding]; } @end检查编译目标配置
确保Xcode的Build Phases -> Compile Sources列表中,同时包含NativeLib.cpp和NativeLibWrapper.mm两个文件——这一步确保它们都会被正确编译,且链接时不会缺失符号。(可选)兼容std::to_string(bool)
如果你遇到std::to_string(bool)的兼容性问题(部分老版本iOS SDK对bool类型的to_string支持有限),可以手动实现一个bool转字符串的函数来替代:// 在NativeLib.cpp里添加辅助函数 std::string boolToString(bool value) { return value ? "true" : "false"; } // 修改sayHello函数 std::string NativeLib::sayHello(bool boolTest) { return "Hello C++ : " + boolToString(boolTest); }
做完这些步骤后,你的代码应该就能正常编译运行,同时保留原有的功能啦!
内容的提问来源于stack exchange,提问作者matteoh

