在xcode中设置C编译标志
我在这个问题上遇到了同样的问题:
Undefine symbols for architecture x86_64 using FFTW
我尝试在xcode中使用标志-L和-l作为C,但它不起作用 这是错误日志: 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很旧,因此您的版本可能略有不同.) 你可能想知道,为什么这有必要? 那么,当你构建项目时,有几个阶段需要经历.最基本的细分是编译和链接. (它们也许可以进一步细分,但这是重要的区别.) 编译器获取源文件(例如,example.cpp)并输出目标文件(例如example.o).目标文件不可执行.编译时,编译器通常只知道它当前正在处理的一个源文件.因此编译器不需要知道您正在使用哪些库 – 它需要知道的是头文件所在的位置. 链接器获取一个或多个目标文件并将它们组合在一起以创建可执行二进制文件.此时,它还必须解析代码中未定义的任何外部符号 – 例如,在外部库中定义的符号.因此,链接器需要知道您正在使用的任何库. 编译器不知道如何处理-l或-L标志 – 它们与将代码编译到目标文件的过程无关. 当您从命令行调用gcc时,它会自动为您调用链接器并将-l和-L标志转发给它.因此,磁盘上不会生成任何目标文件,并且您将获得可执行文件. 但是,当您通过XCode构建时,它会做一些不同的事情.它为每个源文件调用一次编译器,生成如上所述的目标文件. (这就是为什么你可以在Build Phases – > Compile Sources部分为特定源文件指定额外的编译器标志的原因.)因为已经要求编译器生成目标文件,所以它不会调用链接器,因为你’尝试传递应该转发给链接器的标志,你会得到不使用标志的警告. 一旦所有源文件都已成功编译,XCode接下来会直接调用链接器将它们全部组合成一个可执行的二进制文件.这是需要了解您的库的阶段. (顺便说一句,在任何大型项目中,即使您不使用XCode,这种方法通常也是可取的.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |