我正在将一个大型的(~1M LOC)项目从Window / Visual Studio环境移植到其他平台,其中第一个恰好是Mac OS X.
最初项目被配置为Visual Studio解决方案和项目,但现在我正在使用(优秀的)Premake(http://industriousone.com/premake)为多个平台(VS,XCode,GMake)生成项目文件。
我配置,移植和构建了前几个没有任何重大问题的项目,但是移植了数学库,我遇到了这个我无法解决的奇怪的链接错误:从数学中使用的任何函数.h将无法链接(导致未解析的符号)。
作为参考,我正在使用Premake v4.2.1为XCode v3.2.1生成项目,该项目使用gcc v4.2为x86_64架构构建。 (所有这些都在64位Snow Leopard上)我试图通过添加-isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min = 10.6来说服gcc链接并构建针对“已知”SDK的所有内容到构建命令行。
现在在正常情况下,添加-lm应该注意这一点,但是在Darwin中,这些数学库包含在libSystem中,据我所知,它被gcc / ld隐式链接。
我尝试在XCode中创建一个虚拟项目,该项目只运行:
float f = log2(2.0)+log2f(3.f)+log1p(1.1)+log1pf(1.2f)+sin(8.0);
std::cout << f << std::endl;
并且正如预期的那样,这构建得很好。但是,如果我在Premake生成的项目中的代码中放了相同的东西,那么所有这些数学函数最终都没有得到解决。
现在将来自“本机”XCode项目的链接命令与我生成的XCode项目进行比较,它们看起来非常相似(除了我生成的项目也链接其他库)。
'原生'项目:
/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Developer/SDKs/MacOSX10.6.sdk -Lsomepath -Fsomepath -filelist somefile -install_name somename -mmacosx-version-min=10.6 -single_module -compatibility_version 1 -current_version 1 -o somename
生成的项目:
/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -Lsomepath -Fsomepath -filelist somefile -install_name somename -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 somelib.a somelib2.a somelib.dylib somelib2.dylib -single_module -compatibility_version 1 -current_version 1 -o somename
任何有关如何进行的帮助或提示都将非常感激。是否有任何gcc标志或其他工具可以帮助我解决这个问题?
答案 0 :(得分:0)
我终于设法解决/解决了这个问题。
替换
#include <math.h>
float f = sinf(1.f);
与
#include <cmath>
float f = std::sin(1.f);
一切都按预期链接。
我会接受这样一个事实,即cmath解决方案可能是我应该首先编写的代码,尽管我很乐意接受关于为什么我的C方法失败如此悲惨的进一步意见。