同一个android cmake git项目在一台Ubuntu机器上编译得很好,但在另一台Ubuntu机器上编译不好,即使整个项目都是一样的

同一个android cmake git项目在一台Ubuntu机器上编译得很好,但在另一台Ubuntu机器上编译不好,即使整个项目都是一样的,android,c++,ubuntu,compilation,cmake,Android,C++,Ubuntu,Compilation,Cmake,我正在开发一个android cmake项目,它可以在我的32位Ubuntu 12.04工作机器上成功编译(我称之为WorkMachine)。当我想在家里编译它时,我安装了一个32位的Ubuntu 12.04虚拟机(我称之为HomeMachine),我在上面克隆了这个项目,当我开始编译时,它会被一个错误阻塞 CMAKE_CFLAGS are: CMAKE_CXXFLAGS are: -- Configuring done -- Generating done -- Build files h

我正在开发一个android cmake项目,它可以在我的32位Ubuntu 12.04工作机器上成功编译(我称之为WorkMachine)。当我想在家里编译它时,我安装了一个32位的Ubuntu 12.04虚拟机(我称之为HomeMachine),我在上面克隆了这个项目,当我开始编译时,它会被一个错误阻塞

CMAKE_CFLAGS are: 
CMAKE_CXXFLAGS are: 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/raa/Dropbox/Demo/android_build
[  0%] Built target bitstream
[  0%] Built target distrat
[  1%] Built target fisher
[  1%] Built target gtest
[  7%] Built target jpeg-8c
[  7%] Built target map
[  8%] Built target resampler
[  9%] Built target timer
[ 92%] Built target fftw3f-3
[ 96%] Built target vlfeat
[ 96%] Built target extract_shared
[ 97%] Built target shared
[ 97%] Built target cssc_train
Linking CXX executable ../../bin/extract
/home/raa/Dropbox/Demo/libraries/fftw-3.3.3/api/configure.c:28: error: undefined reference to 'fftwf_dft_conf_standard'
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/extract] Error 1
make[1]: *** [src/CMakeFiles/extract.dir/all] Error 2
make: *** [all] Error 2
这里我报告的是gcc版本(两台计算机上的版本相同)

但这怎么可能呢? 问题似乎不是由于某些cmake缓存或类似的错误,因为如果我在工作机器上的另一个目录上克隆项目,代码也会编译得很好。 我可以检查什么来解决问题?如果你需要更多的细节,请问我

谢谢你抽出时间


里卡多

哇!解决了的!这确实是cmake的一种奇怪行为:我有三个conf.c文件,它们必须合并到一个静态库中。当cmake运行AR程序来创建库时,它执行了如下命令:

ar cr dir1/source1.c dir1/source2.c ... dft/conf.c rdft/conf.c 
ar r reodft/conf.c dir2/source3.c

因此,可能是由于要链接的对象文件数量巨大,cmake在两个命令中拆分了ar命令,但第二个命令覆盖了与第一个命令一起添加的两个文件conf.c中的一个,因此使用第一个ar命令定义的符号丢失了!这显然是ar中的一个bug,因为即使源文件相同,内容也可能不同,因此符号不会被删除。谢谢大家!你的建议让我找到了正确的解决方案

Riccardos问题的解决方案是将
ar
的命令行参数从r更改为q(参见手册页了解差异,基本上q不检查重复)

通过

SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q  <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE\u C\u ARCHIVE\u APPEND“q”)

您可能需要检查
CMAKE_AR
是否为“AR”(在其他系统上可能不同)

似乎缺少一些依赖项。一些.h文件,其中声明了“fftwf_dft_conf_standard”,您的工作机器中可能有,但您的家庭机器中没有安装。我用“nm”检查了该特定符号(fftwf_dft_conf_standard)是否存在于库fftw3f-3.a中(如您在上一篇文章中所看到的,已成功构建)但在家用机器中没有该符号的证据,而在工作机器中,该符号的位置是正确的。似乎同一个项目在两台不同的机器上有不同的链接!在创建我的fftw3f-3.a库时,有一种方法可以确定cmake_link_脚本是否工作正常?您可以运行
make VERBOSE=1
查看make运行的大多数命令。哇!解决了的!这确实是cmake的一种奇怪行为:我有三个conf.c文件,它们必须合并到一个静态库中。当cmake运行AR程序来创建库时,它执行了一个命令,类似于:AR cr dir1/source1.c dir1/source2.c。。。dft/conf.c rdft/conf.c ar reodft/conf.c dir2/source3.c
SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q  <TARGET> <LINK_FLAGS> <OBJECTS>")