我正在将一个大型(~1M LOC)项目从 Window/Visual Studio 环境移植到其他平台,其中第一个平台恰好是 Mac OS X。
最初该项目被配置为 Visual Studio 解决方案和项目,但现在我正在使用(优秀的)Premake(http://industriousone.com/premake)为多个平台(VS、XCode、GMake)生成项目文件。
我配置、移植和构建了前几个项目,没有任何重大问题,但是在移植了数学库后,我遇到了这个我无法解决的奇怪链接错误:从 math.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 标志或其他工具可以帮助我解决这个问题?