使用在构建阶段链接的 C++ 库编译 Xcode Swift 项目时出错
Error to compile Xcode Swift project using C++ library linked on Build Phases
我在网上搜索了很多,但没有找到解决我的问题的方法。
我的 objective 是用 C++ 创建一个简单的 class 并在 Swift 上使用它。为此,我确实遵循了本教程 -> http://www.swiftprogrammer.info/swift_call_cpp.html(非常好)。
基本上我遵循了以下步骤:
- 创建
junk.cpp
和 junk.h
个文件
- 使用
g++ or/and clang++
编译
- 创建 .a 文件:
$ ar r libjunkcpp.a junk.o
- Link在
Build Phases -> Link Binary With Libraries -> Add
中变为 Xcode
所以当我这样做时 Xcode 没有编译更多我的项目,在 Xcode 的左侧出现错误消息:
linker command failed with exit code 1 (use -v to see invocation)
并且日志中的错误消息是:
ld: archive has no table of contents file
'/Users/augustosansoncadini/Documents/XcodeProjects/Ex_cpp_Swift_CmdLineTool/junk/libjunkcpp.a'
for architecture x86_64
我认为需要编译它的架构但是当我输入 g++ -v
结果是:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
所以我断定架构目标是正确的。
我认为这张图片可以提供帮助:
注:
当我从 Link Binary With Libraries 中删除 .a
文件时,代码编译正常。
您错过的是调用 ranlib
命令生成 table 内容:
$ ranlib libjunkcpp.a
ar
和 ranlib
命令必须始终成对出现。
在 http://www.swiftprogrammer.info/swift_call_cpp.html 的同一教程结束时遇到了类似的问题。
但是我在构建项目时得到的错误是:
ld: library not found for -ljunkcpp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
不知道 "ljunkcpp" 命名(与“libjunkcpp”)突然从何而来,但我解决它的方法是:
- 一共删除了
libjunkcpp.a
。
- 再次用
g++ -c junk.cpp
编译。
再次 - 运行
ar r hellocpp.a junk.o
(注意不同的 hellocpp.a
文件名)。
- 删除了旧的构建阶段 Link 到
libjunkcpp.a
。
- Linked
hellocpp.a
而不是 Link Binary With Libraries。重建并 运行.
Hello, World!
The integer from C++ is 1234
一定是名字冲突了。希望这对某人有所帮助。
我在网上搜索了很多,但没有找到解决我的问题的方法。 我的 objective 是用 C++ 创建一个简单的 class 并在 Swift 上使用它。为此,我确实遵循了本教程 -> http://www.swiftprogrammer.info/swift_call_cpp.html(非常好)。 基本上我遵循了以下步骤:
- 创建
junk.cpp
和junk.h
个文件 - 使用
g++ or/and clang++
编译
- 创建 .a 文件:
$ ar r libjunkcpp.a junk.o
- Link在
Build Phases -> Link Binary With Libraries -> Add
中变为 Xcode
所以当我这样做时 Xcode 没有编译更多我的项目,在 Xcode 的左侧出现错误消息:
linker command failed with exit code 1 (use -v to see invocation)
并且日志中的错误消息是:
ld: archive has no table of contents file '/Users/augustosansoncadini/Documents/XcodeProjects/Ex_cpp_Swift_CmdLineTool/junk/libjunkcpp.a' for architecture x86_64
我认为需要编译它的架构但是当我输入 g++ -v
结果是:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
所以我断定架构目标是正确的。
我认为这张图片可以提供帮助:
注:
当我从 Link Binary With Libraries 中删除 .a
文件时,代码编译正常。
您错过的是调用 ranlib
命令生成 table 内容:
$ ranlib libjunkcpp.a
ar
和 ranlib
命令必须始终成对出现。
在 http://www.swiftprogrammer.info/swift_call_cpp.html 的同一教程结束时遇到了类似的问题。
但是我在构建项目时得到的错误是:
ld: library not found for -ljunkcpp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
不知道 "ljunkcpp" 命名(与“libjunkcpp”)突然从何而来,但我解决它的方法是:
- 一共删除了
libjunkcpp.a
。 - 再次用
g++ -c junk.cpp
编译。
再次 - 运行
ar r hellocpp.a junk.o
(注意不同的hellocpp.a
文件名)。 - 删除了旧的构建阶段 Link 到
libjunkcpp.a
。 - Linked
hellocpp.a
而不是 Link Binary With Libraries。重建并 运行.
Hello, World!
The integer from C++ is 1234
一定是名字冲突了。希望这对某人有所帮助。