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

2023-11-24

I faced with the same issue for this question: Undefine symbols for architecture x86_64 using FFTW
And I tried to use flag -L and -l for C++ in xcode, but it doesn't work enter image description here Here is the error log:

  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/C++ 标志”下,而应将它们放在“其他链接器标志”下(在链接部分中)。

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


您可能想知道,为什么这是必要的?

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

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

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

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

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

然而,当您通过 XCode 进行构建时,它的工作方式略有不同。它为每个源文件调用一次编译器,生成一个像我上面描述的目标文件。 (这就是为什么您可以在“构建阶段”->“编译源”部分中为特定源文件指定额外的编译器标志的原因。)因为已要求编译器生成目标文件,所以它不会调用链接器,并且因为您'当尝试传递应转发到链接器的标志时,您会收到未使用标志的警告。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 xcode 中设置 C++ 编译标志 的相关文章

随机推荐