2012-10-16 33 views
4

我正在尝试在Xcode中构建一个非常简单的命令行应用程序,该应用程序将打印出有关MXF视频文件的基本信息。为了做到这一点,我需要使用libmxf,libbmx和libbmx图书馆可在这里下载:使用外部库构建Xcode项目时的链接器错误

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 --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项目生成设置下,我有加ed/usr/local/lib到我的搜索路径。在构建阶段下,我已将“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位动态链接共享库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) 

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

回答

9

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

Apple LLVM compiler选项为C++标准库,选择:libstdc++,或选择compiler default(这应该选择的libstdC++也)

+1

Petesh,我的名声禁止我可以投票这件事,但是这是确切的解决方案。百万倍感谢你!我正在这件事上撕掉我的头发。 –

+0

对于像我这样的n00bs,这里是一个(希望)防白痴的指南。在Xcode中,单击左上角的“显示项目导航器”图标,即一个小文件夹。点击顶级项目,这将是您的项目。在显示的窗口中,选择您的主要目标。在构建设置选项卡中,选择所有设置,然后选择“组合”而不是“级别”。向下滚动,直到看到“Apple LLVM编译器4.1 - 语言”组。找到“C++标准库”键,并将其值从libC++更改为libstdC++。 –

+0

@ ned-w也代表你投票。 –

相关问题