C++ 设置C++;在xcode中编译标志
对于这个问题,我面临着同样的问题: 我尝试在xCal码中使用C++的标志-L和-L,但它不起作用。 以下是错误日志:C++ 设置C++;在xcode中编译标志,c++,xcode,gcc,C++,Xcode,Gcc,对于这个问题,我面临着同样的问题: 我尝试在xCal码中使用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 symbo
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构建时,它的工作方式略有不同。它为您的每个源文件调用编译器一次,生成一个如上所述的对象文件。(这就是为什么您可以在“构建阶段->编译源代码”部分中为特定源文件指定额外的编译器标志的原因。)因为编译器被要求生成一个对象文件,所以它不会调用链接器,并且因为您正试图将应转发给链接器的标志传递给它,您会收到警告,表示未使用标志
一旦成功编译了所有源文件,XCode接下来将直接调用链接器,将它们组合成一个可执行的二进制文件。这是需要了解您的库的阶段。(顺便说一句,在任何大型项目中,即使不使用XCode,这种方法通常也是可取的。)您可能需要添加
-lstdc++
到项目的
构建设置中的其他链接器标志
。Wow,它成功了。非常感谢你。但是你能解释一下为什么它在其他链接器标志中工作吗?当我在XCu码中创建C++项目时。我搜索了一下,其他人告诉我应该加入其他C/C++标志
,我在帖子中添加了一个解释,非常清楚。我现在明白了。谢谢你的帮助!