我正在从窗口/Visual Studio环境到其他平台上移植一个大型(〜1m LOC)项目,其中首先是Mac OSX。

最初,该项目被配置为Visual Studio解决方案和项目,但现在我正在使用(出色的)预选(http://indupliousone.com/premake)为多个平台生成项目文件(VS,Xcode,Gmake)。

我配置,移植和构建了前几个项目,没有任何重大问题,但是在移植了数学液体后,我遇到了我无法解决的怪异链接错误: Math.h使用的任何功能都将无法链接(导致未解决的符号)。

作为参考,我正在使用Premake v4.2.1来生成Xcode v3.2.1的项目,该项目使用X86_64体系结构的GCC v4.2构建。 (所有这些都在64位雪豹上)我试图说服GCC通过添加-isysroot/ddeveloper/sdks/macosx10.6.sdk -mmmacosx-version-min = 10.6到构建命令行。

现在,在正常情况下,添加-LM应该考虑到这一点,但是在达尔文中,这些数学液体已包含在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;

正如预期的那样,这可以很好地构建。但是,如果我在预制项目中的代码中放置了相同的内容,那么所有这些数学功能最终都无法解决。

现在,将“本机” Xcode项目的链接命令与我的生成的Xcode项目进行比较,它们似乎非常相同(除了我生成的项目链接其他libs外)。

“本地”项目:

/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标志或其他工具?

有帮助吗?

解决方案

我终于设法解决了这个问题。

通过更换

#include <math.h>
float f = sinf(1.f);

#include <cmath>
float f = std::sin(1.f);

一切都按预期链接。

我会接受这样一个事实,即CMATH解决方案可能是我首先应该写的代码,尽管我很高兴地接受了为什么我的C方法如此惨败的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top