windows - 在 Windows 上链接到 libjpeg 时如何解析 "undefined reference"?

标签 windows g++ cmake mingw libjpeg

我正在尝试构建一个软件,需要 libfftw3f、libxml2 和 libjpeg,并在 Windows 上使用 MinGW 和 CMake。

我已经通过 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 替换了 libjpeg.a .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

最佳答案

像这样包含jpeglib.h:

extern "C" {
    #include <jpeglib.h>
}

关于windows - 在 Windows 上链接到 libjpeg 时如何解析 "undefined reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22731220/

相关文章:

c++ - Cygwin 与 Linux 下 g++ 创建的可执行文件的默认文件扩展名

CMake - 链接到从ExternalProject_add()下载的库

cmake - 使用 CMake 在 GCC 和 Clang/LLVM 之间切换

Java 7 nio FileAttributes 窗口

c++ - to_string 不是 std 的成员,g++ (mingw)

CreateProcess 和 lpCommandLine 生命周期

C++线程意外打印同一行多次

cmake - 是否可以直接使用 MSBuildTools 构建 cmake 项目

c++ - 获取 QWidget 的 Windows 消息而不对其进行子类化并重新实现 QWidget::winEvent

Windows Vista/7 : How to sample output audio mix?