在xcode中设置C ++编译标志

时间:2015-07-10 16:44:46

标签: c++ xcode gcc

我在这个问题上遇到了同样的问题:Undefine symbols for architecture x86_64 using FFTW 我尝试在xcode中使用标志-L和-l作为C ++,但它不起作用 enter image description here 这是错误日志:

  clang: warning: -lsndfile: 'linker' input unused
  clang: warning: -lfftw3: 'linker' input unused
  clang: warning: argument unused during compilation: '-L/usr/local/lib'

  Undefined symbols for architecture x86_64:
   "_fftw_destroy_plan", referenced from:
     _main in main.o
   "_fftw_execute", referenced from:
     _main in main.o
   "_fftw_plan_dft_r2c_1d", referenced from:
   _main in main.o
   "_sf_close", referenced from:
    _main in main.o
   "_sf_open", referenced from:
    _main in main.o
   "_sf_read_double", 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)


但是如果我在命令行中使用gcc进行编译,则效果很好。

  gcc -I/Users/sr2/Documents/Soft/fftw-3.3.4 -I/usr/local/include  
      -L/usr/local/lib -lfftw3 -lsndfile main.c -o fft_sample

我哪里错了?

2 个答案:

答案 0 :(得分:7)

不应将这些内容置于“其他C / C ++标志”之下,而应将其置于“其他链接标志”下(在链接部分中)。

(请注意,我的XCode已经过时了,因此您的版本可能略有不同。)

你可能想知道,为什么这有必要?

好吧,当你构建项目时,有几个阶段需要经历。最基本的细分是编译链接。 (它们也许可以进一步细分,但这是重要的区别。)

编译器获取源文件(例如, example.cpp )并输出目标文件(例如 example.o )。目标文件不可执行。编译时,编译器通常只知道它当前正在处理的一个源文件。因此,编译器不需要知道您正在使用哪些库 - 它需要知道的是头文件的位置。

链接器获取一个或多个目标文件,并将它们组合在一起以创建可执行二进制文件。此时,它还必须解析代码中未定义的任何外部符号 - 例如,在外部库中定义的符号。因此,链接器需要知道您正在使用的任何库。

编译器不知道该怎么做带有-l-L标志 - 它们与将代码编译成目标文件的过程无关。

当您从命令行调用gcc时,它会自动为您调用链接器并将-l-L标志转发给它。因此,磁盘上不会生成任何目标文件,并且您将获得可执行文件。

然而,当你通过XCode构建时,它会做一些不同的事情。它为每个源文件调用一次编译器,生成如上所述的目标文件。 (这就是为什么你可以在Build Phases - > Compile Sources部分为特定源文件指定额外的编译器标志的原因。)因为已经要求编译器生成目标文件,所以它不会调用链接器,因为你'尝试传递应该转发给链接器的标志,你得到警告说不使用标志。

一旦所有源文件都已成功编译,XCode接下来会直接调用链接器将它们全部组合成一个可执行的二进制文件。这是需要了解您的库的阶段。 (顺便说一句,在任何大型项目中,即使您不使用XCode,这种方法通常也是可取的。)

答案 1 :(得分:0)

您可能需要添加

    # Create an envelope custom field to save the our application's
    # data about the envelope
    $custom_field = new \DocuSign\eSign\Model\TextCustomField([
        'name' => 'app metadata item',
        'required' => 'false',
        'show' => 'true', # Yes, include in the CoC
        'value' => '1234567']);
    $custom_fields = new \DocuSign\eSign\Model\CustomFields([
        'text_custom_fields' => [$custom_field]]);
    $envelope_definition->setCustomFields($custom_fields);

转到项目select SUBSTRING_INDEX( Name, ' ', -1 ) 中的-lstdc++