我在这个问题上遇到了同样的问题:使用FFTW为架构x86_64取消定义符号
我尝试在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)
Run Code Online (Sandbox Code Playgroud)
但是如果我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
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
cel*_*rel 10
它们应该在"其他链接器标志"(在链接部分中)下,而不是将它们放在"其他C/C++标志"下.
(请注意,我的XCode很旧,因此您的版本可能略有不同.)
你可能想知道,为什么这有必要?
那么,当你构建项目时,有几个阶段需要经历.最基本的细分是编译和链接.(它们也许可以进一步细分,但这是重要的区别.)
所述编译器需要一个源文件(例如,example.cpp),并输出一个目标文件(例如example.o).目标文件不可执行.编译时,编译器通常只知道它当前正在处理的一个源文件.因此编译器不需要知道您正在使用哪些库 - 它需要知道的是头文件所在的位置.
该连接器需要一个或多个对象文件,并结合在一起,创建一个可执行二进制文件.此时,它还必须解析代码中未定义的任何外部符号 - 例如,在外部库中定义的符号.因此,链接器需要知道您正在使用的任何库.
编译器不知道做什么用-l或-L标志-他们没有相关的编译代码成目标文件的过程.
当你调用gcc在命令行像你证明了,它会自动调用链接为您和转发那些-l和-L标志吧.因此,磁盘上不会生成任何目标文件,并且您将获得可执行文件.
但是,当您通过XCode构建时,它会做一些不同的事情.它为每个源文件调用一次编译器,生成如上所述的目标文件.(这就是为什么你可以在Build Phases - > Compile Sources部分为特定的源文件指定额外的编译器标志的原因.)因为已经要求编译器生成一个目标文件,所以它不会调用链接器,因为你'尝试传递应该转发给链接器的标志,你会得到不使用标志的警告.
一旦所有源文件都已成功编译,XCode接下来会直接调用链接器将它们全部组合成一个可执行的二进制文件.这是需要了解您的库的阶段.(顺便说一句,在任何大型项目中,即使您不使用XCode,这种方法通常也是可取的.)
| 归档时间: |
|
| 查看次数: |
9846 次 |
| 最近记录: |