无法在 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++.alibssl.alibz.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 上链接静态库的主要内容,如果未能解决你的问题,请参考以下文章

C++ Singleton 无法在 Mac OS 上链接

如何使用cmake在mac上链接OpenGL相关库?

无法在 qt creator (linux) 上链接共享库

Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集

无法在 qt creator 上的 c++ 上链接 realsense 库

MacOS 上的 Qbs 静态库