【发布时间】:2014-03-29 12:41:16
【问题描述】:
我正在尝试在 Windows 上使用 MinGW 和 CMake 构建一个需要 libfftw3f、libxml2 和 libjpeg 的软件。
我已经通过mingw-get 下载了libxml2 的编译版本,并自己从源代码构建了libfftw3f 和libjpeg,没有任何问题。在 CMake GUI 中设置包含和库路径后,生成 Makefile,mingw32-make 编译所有源文件。但是在链接二进制文件时,我收到以下错误消息:
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x1
90): undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x1
b4): undefined reference to `jpeg_CreateCompress(jpeg_compress_struct*, int, uns
igned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x1
c6): undefined reference to `jpeg_stdio_dest(jpeg_compress_struct*, _iobuf*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x1
f6): undefined reference to `jpeg_set_defaults(jpeg_compress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x2
0d): undefined reference to `jpeg_set_quality(jpeg_compress_struct*, int, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x2
1d): undefined reference to `jpeg_start_compress(jpeg_compress_struct*, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x2
58): undefined reference to `jpeg_write_scanlines(jpeg_compress_struct*, unsigne
d char**, unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x2
66): undefined reference to `jpeg_finish_compress(jpeg_compress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x2
e5): undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
09): undefined reference to `jpeg_CreateDecompress(jpeg_decompress_struct*, int,
unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
1b): undefined reference to `jpeg_stdio_src(jpeg_decompress_struct*, _iobuf*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
2b): undefined reference to `jpeg_read_header(jpeg_decompress_struct*, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
59): undefined reference to `jpeg_start_decompress(jpeg_decompress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
ff): undefined reference to `jpeg_read_scanlines(jpeg_decompress_struct*, unsign
ed char**, unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x4
38): undefined reference to `jpeg_finish_decompress(jpeg_decompress_struct*)'
collect2: ld returned 1 exit status
mingw32-make[2]: *** [detect_ffld.exe] Error 1
mingw32-make[1]: *** [CMakeFiles/detect_ffld.dir/all] Error 2
mingw32-make: *** [all] Error 2
提到的文件JPEGImage.cpp包括jpeglib.h。
CMake 生成的我的link.txt 显示以下行:
C:\PROGRA~2\MinGW\bin\g++.exe -fopenmp -O3 -DNDEBUG -fopenmp -Wl,--whole-archive CMakeFiles\detect_ffld.dir/objects.a -Wl,--no-whole-archive -o detect_ffld.exe -Wl,--out-implib,libdetect_ffld.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:\ffld\fftw-3.3.4\.libs -LC:\ffld\jpeg-6b\.libs -L"C:\Program Files (x86)\MinGW\msys\1.0\lib" -lfftw3f -ljpeg -lxml2 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
我想知道 g++ 试图链接到 jpeg_std_error,而运行 nm libjpeg.a 后发现,过程的名称是 _jpeg_std_error(前导下划线似乎在 Windows 上的 C 函数中很常见)。我已经尝试通过运行objcopy --remove-leading-char libjpeg.a libjpeg2.a 创建一个不带前导下划线的libjpeg 版本(当然,在那之后,我用新的libjpeg2.a 替换了libjpeg.a)。但这并没有以任何方式改变mingw32-make 的上述输出。
任何建议都会很棒。提前致谢!
编辑 - 附加信息
来自 CMakeLists.txt 的相关摘录
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(FFLD)
SET(HEADERS Rectangle.h JPEGImage.h Object.h Scene.h HOGPyramid.h Patchwork.h Model.h Mixture.h Intersector.h)
SET(SOURCES Rectangle.cpp JPEGImage.cpp Object.cpp Scene.cpp HOGPyramid.cpp
Patchwork.cpp Model.cpp Mixture.cpp)
ADD_EXECUTABLE(detect_ffld ${HEADERS} ${SOURCES} ffld.cpp)
# There are no CMake FFTW package, so find it ourselves
FIND_PATH(FFTW3_INCLUDE_DIR fftw3.h)
IF(FFLD_HOGPYRAMID_DOUBLE)
FIND_LIBRARY(FFTW3_LIBRARIES fftw3)
ELSE()
FIND_LIBRARY(FFTW3_LIBRARIES fftw3f)
ENDIF()
IF(NOT FFTW3_INCLUDE_DIR OR NOT FFTW3_LIBRARIES)
MESSAGE(FATAL_ERROR "Could not find fftw3.")
ENDIF()
INCLUDE_DIRECTORIES(${FFTW3_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(detect_ffld ${FFTW3_LIBRARIES})
FIND_PACKAGE(JPEG REQUIRED)
IF(JPEG_FOUND)
INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(detect_ffld ${JPEG_LIBRARIES})
ENDIF()
FIND_PACKAGE(LibXml2 REQUIRED)
IF(LIBXML2_FOUND)
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(detect_ffld ${LIBXML2_LIBRARIES})
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS})
ENDIF()
FIND_PACKAGE(OpenMP)
IF(OPENMP_FOUND)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
ENDIF()
请注意,使用可用的 libjpeg、libxml2 和 libfftw3 包在 Linux 上构建它就像一个魅力。但是在 Windows 上,我必须自己在 CMake GUI 中设置目录和库的路径,尤其是链接 libjpeg 很麻烦。
mingw32-make VERBOSE=1 的输出
"C:\Program Files (x86)\CMake\bin\cmake.exe" -HC:\ffld\ffld -BC:\ffld\ffld\build
--check-build-system CMakeFiles\Makefile.cmake 0
mingw32-make -f CMakeFiles\Makefile2 detect_ffld
mingw32-make[1]: Entering directory 'C:/ffld/ffld/build'
"C:\Program Files (x86)\CMake\bin\cmake.exe" -HC:\ffld\ffld -BC:\ffld\ffld\build
--check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_start C:\ffld\ffl
d\build\CMakeFiles 9
mingw32-make -f CMakeFiles\Makefile2 CMakeFiles/detect_ffld.dir/all
mingw32-make[2]: Entering directory 'C:/ffld/ffld/build'
mingw32-make -f CMakeFiles\detect_ffld.dir\build.make CMakeFiles/detect_ffld.dir
/depend
mingw32-make[3]: Entering directory 'C:/ffld/ffld/build'
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles"
C:\ffld\ffld C:\ffld\ffld C:\ffld\ffld\build C:\ffld\ffld\build C:\ffld\ffld\bui
ld\CMakeFiles\detect_ffld.dir\DependInfo.cmake --color=
mingw32-make[3]: Leaving directory 'C:/ffld/ffld/build'
mingw32-make -f CMakeFiles\detect_ffld.dir\build.make CMakeFiles/detect_ffld.dir
/build
mingw32-make[3]: Entering directory 'C:/ffld/ffld/build'
Linking CXX executable detect_ffld.exe
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\det
ect_ffld.dir\link.txt --verbose=1
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E remove -f CMakeFiles\detect_ffld
.dir/objects.a
C:\PROGRA~2\MinGW\bin\ar.exe cr CMakeFiles\detect_ffld.dir/objects.a @CMakeFiles
\detect_ffld.dir\objects1.rsp
C:\PROGRA~2\MinGW\bin\G__~1.EXE -fopenmp -O3 -DNDEBUG -fopenmp -Wl,--whole-
archive CMakeFiles\detect_ffld.dir/objects.a -Wl,--no-whole-archive -o detect_f
fld.exe -Wl,--out-implib,libdetect_ffld.dll.a -Wl,--major-image-version,0,--mino
r-image-version,0 -LC:\ffld\fftw-3.3.4\.libs -LC:\ffld\jpeg-6b -L"C:\Program Fi
les (x86)\MinGW\msys\1.0\lib" -lfftw3f -ljpeg -lxml2 -lkernel32 -luser32 -lgdi32
-lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x3
f0): undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x4
16): undefined reference to `jpeg_CreateDecompress(jpeg_decompress_struct*, int,
unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x4
22): undefined reference to `jpeg_stdio_src(jpeg_decompress_struct*, _iobuf*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x4
32): undefined reference to `jpeg_read_header(jpeg_decompress_struct*, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x4
62): undefined reference to `jpeg_start_decompress(jpeg_decompress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x5
00): undefined reference to `jpeg_read_scanlines(jpeg_decompress_struct*, unsign
ed char**, unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x5
3a): undefined reference to `jpeg_finish_decompress(jpeg_decompress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
20): undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
43): undefined reference to `jpeg_CreateCompress(jpeg_compress_struct*, int, uns
igned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
53): undefined reference to `jpeg_stdio_dest(jpeg_compress_struct*, _iobuf*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
8e): undefined reference to `jpeg_set_defaults(jpeg_compress_struct*)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
a9): undefined reference to `jpeg_set_quality(jpeg_compress_struct*, int, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
b9): undefined reference to `jpeg_start_compress(jpeg_compress_struct*, int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
e8): undefined reference to `jpeg_write_scanlines(jpeg_compress_struct*, unsigne
d char**, unsigned int)'
CMakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj):JPEGImage.cpp:(.text+0x7
f5): undefined reference to `jpeg_finish_compress(jpeg_compress_struct*)'
c:/progra~2/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C
MakeFiles\detect_ffld.dir/objects.a(JPEGImage.cpp.obj): bad reloc address 0x64 i
n section `.text$_ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_iter
atorIPhS1_EEjRKh[__ZNSt6vectorIhSaIhEE14_M_fill_insertEN9__gnu_cxx17__normal_ite
ratorIPhS1_EEjRKh]'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\detect_ffld.dir\build.make:300: recipe for target 'detect_ffld.exe' f
ailed
mingw32-make[3]: *** [detect_ffld.exe] Error 1
mingw32-make[3]: Leaving directory 'C:/ffld/ffld/build'
CMakeFiles\Makefile2:97: recipe for target 'CMakeFiles/detect_ffld.dir/all' fail
ed
mingw32-make[2]: *** [CMakeFiles/detect_ffld.dir/all] Error 2
mingw32-make[2]: Leaving directory 'C:/ffld/ffld/build'
CMakeFiles\Makefile2:109: recipe for target 'CMakeFiles/detect_ffld.dir/rule' fa
iled
mingw32-make[1]: *** [CMakeFiles/detect_ffld.dir/rule] Error 2
mingw32-make[1]: Leaving directory 'C:/ffld/ffld/build'
Makefile:121: recipe for target 'detect_ffld' failed
mingw32-make: *** [detect_ffld] Error 2
【问题讨论】:
-
即使您收到的错误中提到了
jpeg_std_error,但该名称已被 GCC 解构,因此链接器知道它应该查找_jpeg_std_error。只是想知道:您不能将 libjpeg 构建为项目的一部分,以便使用与此相同的标志吗? -
我必须为 libjpeg 创建适当的 CMake 文件,不是吗?将 libjpeg 的配置脚本移植到 CMake 似乎有点复杂。还是我误会了你?
-
不,我就是这个意思。问题是,我只是想确保 libjpeg 和您的项目都使用相同的选项进行编译。
-
好的,现在我已经按照建议在同一个项目中使用 CMake 构建了 libjpeg。但是,不幸的是,我仍然收到相同的错误消息。
-
而且,为了排除显而易见的问题,您在
target_link_libraries中链接的目标中指定了 libjpeg,不是吗?
标签: windows g++ cmake mingw libjpeg