【问题标题】:Setting C++ compile flags in xcode在 xcode 中设置 C++ 编译标志
【发布时间】:2015-09-29 12:29:33
【问题描述】:

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

  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

我哪里错了?

【问题讨论】:

    标签: c++ xcode gcc


    【解决方案1】:

    不应将它们放在“其他 C/C++ 标志”下,而应放在“其他链接器标志”下(在链接部分)。

    (请注意,我的 XCode 很旧,因此您的版本可能会略有不同。)


    您可能想知道,为什么需要这样做?

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

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

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

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

    当您像演示的那样从命令行调用 gcc 时,它会自动为您调用链接器并将那些 -l-L 标志转发给它。因此,不会在磁盘上生成目标文件,而您会得到一个可执行文件。

    但是,当您通过 XCode 构建时,它的处理方式会有所不同。它为您的每个源文件调用一次编译器,生成一个如上所述的目标文件。 (这就是为什么您可以在 Build Phases -> Compile Sources 部分中为特定源文件指定额外的编译器标志的原因。)因为编译器被要求生成一个目标文件,它不会调用链接器,并且因为你'重新尝试将应该转发给链接器的标志传递给它,您会收到未使用标志的警告。

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

    【讨论】:

    • 哇,它成功了。太感谢了。但是您能解释一下为什么它在Other Linker Flags 中有效吗?当我在 xcode 中创建一个 C++ 项目时。我搜索了其他人告诉我应该输入Other C/C++ Flags
    • 我在帖子中添加了解释。
    • 很清楚。我现在可以理解了。感谢您的帮助!
    【解决方案2】:

    你可能需要添加

    -lstdc++
    

    到您项目的Build Settings 中的Other Linker Flags

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多