【问题标题】:Linker Error when building Xcode project using external library使用外部库构建 Xcode 项目时出现链接器错误
【发布时间】:2012-10-06 08:36:29
【问题描述】:

我正在尝试在 Xcode 中构建一个非常简单的命令行应用程序,它将打印出有关 MXF 视频文件的基本信息。为此,我需要使用可在此处下载的 libmxf、libbmx 和 libbmx 库:

http://sourceforge.net/p/bmxlib/home/Home/

此时我的 C++ 代码非常简单:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cerrno>
#include <vector>

#include <bmx/mxf_reader/MXFFileReader.h>
#include <bmx/mxf_reader/MXFGroupReader.h>
#include <bmx/mxf_reader/MXFSequenceReader.h>
#include <bmx/mxf_reader/MXFFrameMetadata.h>
#include <bmx/MXFUtils.h>
#include <bmx/Utils.h>

using namespace std;
using namespace bmx;

#define MXF_OPEN_READ(fn, pf)   mxf_disk_file_open_read(fn, pf)

int main(int argc, const char * argv[])
{
    std::vector<const char *> filenames;
    std::cout << "mxfheader: execution beginning...\n";
    for (int cmdln_index = 0; cmdln_index < argc; cmdln_index++) {
        if (!check_file_exists(argv[cmdln_index])) {
            if (argv[cmdln_index][0] == '-') {
                fprintf(stderr, "Unknown argument '%s'\n", argv[cmdln_index]);
            } else {
                fprintf(stderr, "Failed to open input filename '%s'\n", argv[cmdln_index]);
            }
            return 1;
        }
        filenames.push_back(argv[cmdln_index]);
    }

    std::cout << filenames[0] << "\n";
    return 0;
}

当我编译 BMX 库时,我肯定会使用 64 位支持运行 configure,如下所示:

./configure --build=x86_64-apple-darwin11.4.2 --host=x86_64-apple-darwin11.4.2 CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LDFLAGS="-arch x86_64" CC=clang CXX=clang++

在构建设置下的 XCode 项目中,我已将 /usr/local/lib 添加到我的搜索路径中。在 Build Phases 下,我已将“libbmx-0.1.3.dylib”、“libMXF-1.0.4.dylib”和“libMXF++-1.0.4.dylib”添加到“Link Binary With Libraries”部分。

我已经验证这些库确实是 64 位的(文件 libbmx-0.1.3.dylib 返回 libbmx-0.1.3.dylib: Mach-O 64-bit 动态链接共享库 x86_64 )。

每次我尝试构建应用程序时,都会收到以下链接器错误:

Ld /Users/ned/Library/Developer/Xcode/DerivedData/mxfheader-bkwawmplsoqpdadfxartceqkbolo/Build/Products/Debug/mxfheader normal x86_64
    cd /Users/ned/Documents/src/mxfheader
    setenv MACOSX_DEPLOYMENT_TARGET 10.7
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/ned/Library/Developer/Xcode/DerivedData/mxfheader-bkwawmplsoqpdadfxartceqkbolo/Build/Products/Debug -L/usr/local/lib -F/Users/ned/Library/Developer/Xcode/DerivedData/mxfheader-bkwawmplsoqpdadfxartceqkbolo/Build/Products/Debug -filelist /Users/ned/Library/Developer/Xcode/DerivedData/mxfheader-bkwawmplsoqpdadfxartceqkbolo/Build/Intermediates/mxfheader.build/Debug/mxfheader.build/Objects-normal/x86_64/mxfheader.LinkFileList -mmacosx-version-min=10.7 -stdlib=libc++ -lbmx-0.1.3 -lMXF-1.0.4 -lMXF++-1.0.4 -o /Users/ned/Library/Developer/Xcode/DerivedData/mxfheader-bkwawmplsoqpdadfxartceqkbolo/Build/Products/Debug/mxfheader

Undefined symbols for architecture x86_64:
  "bmx::check_file_exists(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: c++ xcode linker


    【解决方案1】:

    您的问题是命令行中的选项:-stdlib=libc++。它导致了指向错误 libc++ 的链接,您需要将其设为 -stdlib=libstdc++,因为这是编译 libbmx 库的标准库。

    在 C++ 标准库的 Apple LLVM compiler 选项下,选择:libstdc++,或选择 compiler default(也应选择 libstdc++)

    【讨论】:

    • Petesh,我的名声不允许我投票,但这是正确的解决方案。一百万次谢谢你!!!我正在把头发扯下来。
    • 对于像我这样的 n00bs,这里有一个(希望是)防白痴指南。在 Xcode 中,单击“显示项目导航器”图标,左上角的一个小文件夹。单击顶层项目,这将是您的项目。在显示的窗口中,选择您的主要目标。在构建设置选项卡中,选择所有设置,然后选择“组合”而不是“级别”。向下滚动,直到看到“Apple LLVM 编译器 4.1 - 语言”组。找到“C++ 标准库”键,并将其值从 libc++ 更改为 libstdc++。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2018-12-14
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多