无法在 Mac OS X 上链接静态库
Posted
技术标签:
【中文标题】无法在 Mac OS X 上链接静态库【英文标题】:Can't link static library on Mac OS X 【发布时间】:2018-05-05 08:48:28 【问题描述】:我无法将静态库链接到 Mac OS X 上的可执行文件。
我的仓库目录中有lib
女巫包含所有库,例如libstdc++.a
、libssl.a
、libz.a
。
CMakeList.txt 包含:
(...)
set(PROJECT_LINK_LIBS libcurl.a libz.a libssl.a libcrypto.a libstdc++.a libjson-c.a)
link_directories(lib/)
add_executable(myapp $SOURCES)
target_link_libraries(myapp $PROJECT_LINK_LIBS $CMAKE_THREAD_LIBS_INIT $CMAKE_DL_LIBS)
编译时我收到一条消息(对于每个 .a
文件):
ld: warning: ignoring file /Users/kuba/CLionProjects/RigService/lib/macos/libz.a, file was built for archive which is not the architecture being linked (x86_64)
和:
Undefined symbols for architecture x86_64:
"_curl_easy_cleanup", referenced from:
HTTPConnection::request(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*) in HTTPConnection.cpp.o
"_curl_easy_init", referenced from:
HTTPConnection::request(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*) in HTTPConnection.cpp.o
"_curl_easy_perform", referenced from:
HTTPConnection::request(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*) in HTTPConnection.cpp.o
(...)
我之前在linux上编译过,没有任何问题。
我试图从.a
中提取所有.o
文件,然后再次使用
ar rcs libcurl.a *.o
但之后我遇到了同样的问题。 我还试图通过
建立档案libtool -static -o libcurl.a *.o
但后来我收到一条消息:
sal:libcrypto kuba$ libtool -static -o libcrypto.a *.o
error: /Library/Developer/CommandLineTools/usr/bin/libtool: file: a_bitstr.o is not an object file (not allowed in a library)
error: /Library/Developer/CommandLineTools/usr/bin/libtool: file: a_bool.o is not an object file (not allowed in a library)
error: /Library/Developer/CommandLineTools/usr/bin/libtool: file: a_bytes.o is not an object file (not allowed in a library)
(...) // error for each .o file
这是我的问题,也许我应该从它开始,我可以在 linux 和 mac os 上编译时链接相同的 .a
文件吗?
【问题讨论】:
提取的目标文件真的是MacOS目标文件吗?您似乎正在尝试使用 Linux 对象文件构建 MacOS 库(这显然是错误的)。 【参考方案1】:您是否尝试使用为 Linux 构建的库?那行不通,您需要为 macOS 构建的库。
【讨论】:
在 macOS 上编译的工作程序,带有 macOS 的库,在 linux 上吗? 没有。 macOS 上需要 macOS 库,Linux 上需要 Linux 库。 请再告诉我一件事。我可以在 macOS 上使用 Linux 库编译程序以在 Linux 上运行吗? 不适用于标准编译器和工具链。您可以安装交叉编译器和工具链,但设置运行 Linux 的虚拟机并使用它为 Linux 构建可能更容易。以上是关于无法在 Mac OS X 上链接静态库的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集