我正在开发一个用C ++编写的独立项目;它不会调用任何第三方库或任何外部依赖项 - 即它完全是独立的。它主要是在Ubuntu上开发的。
我在两台独立的机器上安装了新的Ubuntu并安装了新的OS X 10.11。我在Ubuntu和OS X上遵循相同的过程,但是OS X不会链接到项目中的其他文件。
我在OS X上遇到的错误是
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
参考中的符号是项目本身定义的符号。 Ubuntu无需任何更改即可正常运行链接并正常运行。只是OS X不会链接。
我使用的确切方法将在下面详细说明。问题是:是什么导致OS X安装无法链接? Ubuntu与OS X上的g++-4.9
之间有什么区别可能导致此问题?我在Ubuntu上使用g++
和在OS X上使用Homebrew安装apt-get
- 两者都是完全相同的g++
版本。两个版本的g++
似乎都成功链接到C ++ STL中的头文件,因此它似乎不是编译器安装错误。任何想法,评论或建议都将非常感激。
这两个步骤在两台机器上重复相同:
1)从git克隆回购到主目录
2)cd进回购
3)make
为了显示有关编译器设置的信息,我在两台机器上都包含了g++ -v
的输出。
Ubuntu的
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.3-8ubuntu2~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.3 (Ubuntu 4.9.3-8ubuntu2~14.04)
OS X
Using built-in specs.
COLLECT_GCC=/usr/local/bin/g++
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc49/4.9.3/libexec/gcc/x86_64-apple-darwin15.2.0/4.9.3/lto-wrapper
Target: x86_64-apple-darwin15.2.0
Configured with: ../configure --build=x86_64-apple-darwin15.2.0 --prefix=/usr/local/Cellar/gcc49/4.9.3 --libdir=/usr/local/Cellar/gcc49/4.9.3/lib/gcc/4.9 --enable-languages=c,c++,objc,obj-c++ --program-suffix=-4.9 --with-gmp=/usr/local/opt/gmp4 --with-mpfr=/usr/local/opt/mpfr2 --with-mpc=/usr/local/opt/libmpc08 --with-cloog=/usr/local/opt/cloog018 --with-isl=/usr/local/opt/isl011 --with-system-zlib --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --with-build-config=bootstrap-debug --disable-werror --with-pkgversion='Homebrew gcc49 4.9.3' --with-bugurl=https://github.com/Homebrew/homebrew-versions/issues --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.9.3 (Homebrew gcc49 4.9.3)
要添加更多信息,有问题的符号在sim/
中定义,编译代码在src/
中。 Makefile位于src
中,如下所示:
ROOT=`cd ../sim;pwd`
CXX=/usr/local/bin/g++
CXXFLAGS = -std=c++0x -g -O4 -fPIC -I$(ROOT)
lib: test.o
$(CXX) $(CXXFLAGS) -shared -o libtest.so test.o