Я пытаюсь использовать find_library и target_link_libraries для связи статической библиотеки (libsndfile) в Windows. Команда find_library работает (что я могу проверить с помощью сообщения), но я все еще получаю неопределенные ссылки, когда я запускаю make (используя MinGW / mingw32-make).
Я что-то не так делаю в моем файле CMakeLists.txt, или я что-то упускаю?
cmake_minimum_required(VERSION 3.0.0)
# Project name
project(ClickDetect)
include_directories(
.
D:/libs/libsndfile/include
)
# Tried adding this:
#link_directories (D:/libs/libsndfile/lib)
# Define the C sources
set ( OSLCODA_SRCS
${CMAKE_CURRENT_LIST_DIR}/ALT/find_click.c
${CMAKE_CURRENT_LIST_DIR}/ALT/four1.c
${CMAKE_CURRENT_LIST_DIR}/src/osl_coda.c
)
SET_SOURCE_FILES_PROPERTIES( ${OSLCODA_SRCS} PROPERTIES LANGUAGE C )
#Tried this way:
#SET_TARGET_PROPERTIES(SNDFILE PROPERTIES
# IMPORTED_LOCATION D:/libs/libsndfile/lib/libsndfile-1.a)
# This seems to find the library... either .a or .lib
find_library(SNDFILE NAMES "libsndfile-1.a"
PATHS "D:/libs/libsndfile/lib" NO_DEFAULT_PATH)
# Prints "SNDFILE: D:/libs/libsndfile/lib/libsndfile-1.a"
if(NOT SNDFILE)
message(FATAL_ERROR "libsndfile Not Found!")
else()
message(STATUS "SNDFILE: ${SNDFILE}")
endif()
add_executable(oslcoda ${OSLCODA_SRCS})
target_link_libraries(oslcoda ${SNDFILE} )
выход:
D:\FORCE\ClickDetect>cmake D:\FORCE\ClickDetect -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -BD:\FORCE\ClickDetect/cmake-build
-- The C compiler identification is GNU 5.3.0
-- The CXX compiler identification is GNU 5.3.0
-- Check for working C compiler: C:/Qt5.7/Tools/mingw530_32/bin/gcc.exe
-- Check for working C compiler: C:/Qt5.7/Tools/mingw530_32/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Qt5.7/Tools/mingw530_32/bin/g++.exe
-- Check for working CXX compiler: C:/Qt5.7/Tools/mingw530_32/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- SNDFILE: D:/libs/libsndfile/lib/libsndfile-1.a
-- Configuring done
-- Generating done
-- Build files have been written to: D:/FORCE/ClickDetect/cmake-build
D:\FORCE\ClickDetect>cd cmake-build
D:\FORCE\ClickDetect\cmake-build>mingw32-make VERBOSE=1
"C:\Program Files (x86)\CMake\bin\cmake.exe" -HD:\FORCE\ClickDetect -BD:\FORCE\ClickDetect\cmake-build --check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_start D:\FORCE\ClickDetect\cmake-build\CMakeFiles D:\FORCE\ClickDetect\cmake-build\CMakeFiles\progress.marks
mingw32-make -f CMakeFiles\Makefile2 all
mingw32-make[1]: Entering directory 'D:/FORCE/ClickDetect/cmake-build'
mingw32-make -f CMakeFiles\oslcoda.dir\build.make CMakeFiles/oslcoda.dir/depend
mingw32-make[2]: Entering directory 'D:/FORCE/ClickDetect/cmake-build'
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" D:\FORCE\ClickDetect D:\FORCE\ClickDetect D:\FORCE\ClickDetect\cmake-build D:\FORCE\ClickDetect\cmake-build D:\FORCE\ClickDetect\cmake-build\CMakeFiles\oslcoda.dir\DependInfo.cmake --color=
mingw32-make[2]: Leaving directory 'D:/FORCE/ClickDetect/cmake-build'
mingw32-make -f CMakeFiles\oslcoda.dir\build.make CMakeFiles/oslcoda.dir/build
mingw32-make[2]: Entering directory 'D:/FORCE/ClickDetect/cmake-build'
[ 25%] Linking C executable oslcoda.exe
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\oslcoda.dir\link.txt --verbose=1
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E remove -f CMakeFiles\oslcoda.dir/objects.a
C:\Qt5.7\Tools\mingw530_32\bin\ar.exe cr CMakeFiles\oslcoda.dir/objects.a @CMakeFiles\oslcoda.dir\objects1.rsp
C:\Qt5.7\Tools\mingw530_32\bin\gcc.exe -O3 -DNDEBUG -Wl,--whole-archive CMakeFiles\oslcoda.dir/objects.a -Wl,--no-whole-archive -o oslcoda.exe -Wl,--out-implib,liboslcoda.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\oslcoda.dir\linklibs.rsp
CMakeFiles\oslcoda.dir/objects.a(osl_coda.c.obj):osl_coda.c:(.text.startup+0x1c9): undefined reference to `sf_open'
CMakeFiles\oslcoda.dir/objects.a(osl_coda.c.obj):osl_coda.c:(.text.startup+0x2a4): undefined reference to `sf_read_int'
CMakeFiles\oslcoda.dir/objects.a(osl_coda.c.obj):osl_coda.c:(.text.startup+0x3b7): undefined reference to `sf_read_int'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\oslcoda.dir\build.make:151: recipe for target 'oslcoda.exe' failed
mingw32-make[2]: *** [oslcoda.exe] Error 1
mingw32-make[2]: Leaving directory 'D:/FORCE/ClickDetect/cmake-build'
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/oslcoda.dir/all' failed
mingw32-make[1]: *** [CMakeFiles/oslcoda.dir/all] Error 2
mingw32-make[1]: Leaving directory 'D:/FORCE/ClickDetect/cmake-build'
Makefile:82: recipe for target 'all' failed
mingw32-make: *** [all] Error 2
РЕДАКТИРОВАТЬ :
Содержимое linklibs.rsp:
D:/libs/libsndfile/lib/libsndfile-1.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
UPDATE
Цыварев прав, ошибка, похоже, вообще не в cmake, я просто не понимаю, как CMake выбирает свою цепочку инструментов. Как предложено в комментариях, я запустил команду link вручную и получил ту же ошибку. Оказывается, оригинальная сборка была сделана с MSYS / MinGW, и у меня на пути был и он, и мой Qt MinGW. CMake использовал мою установку Qt, которая, как мне показалось, была в порядке, но она не работает (думаю, потому что это 64-битная сборка библиотеки).
Так что после долгих попыток с путями и переменными CC и CXX я связал его с помощью MSYS mingw64. Я все еще не уверен, понимаю ли я, как правильно переключать цепочку инструментов. Я пытался просто использовать CC и CXX для установки местоположения компилятора, но все становится очень запутанным, если у вас есть несколько цепочек инструментов на вашем системном пути. В конце концов мне пришлось оставить CC и CXX пустыми и просто убедиться, что путь MSYS находится перед моей установкой Qt на пути, чтобы CMake поднял его и ничего больше. Это, вероятно, испортит сборки для других моих проектов.