Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake find_库可以工作,但仍然可以获得未定义的引用_Cmake - Fatal编程技术网

CMake find_库可以工作,但仍然可以获得未定义的引用

CMake find_库可以工作,但仍然可以获得未定义的引用,cmake,Cmake,我正在尝试使用find_库和target_link_库来链接Windows中的静态库(libsndfile)。find_library命令可以工作(我可以用消息验证),但在运行make(使用MinGW/mingw32 make)时仍然会得到未定义的引用 我是否在CMakeLists.txt文件中做了一些错误的事情,或者我遗漏了其他一些东西 cmake_minimum_required(VERSION 3.0.0) # Project name project(ClickDetect) inc

我正在尝试使用find_库和target_link_库来链接Windows中的静态库(libsndfile)。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 
更新

Tsyvarev是正确的错误似乎与cmake无关,我只是不明白cmake是如何选择其工具链的。正如评论中所建议的那样,我手动运行link命令,得到了相同的错误。原来最初的构建是用MSYS/MinGW完成的,我的路径上有它和Qt-MinGW。CMake使用的是我的Qt安装,我认为这很好,但不起作用(我猜是因为它是一个64位的lib构建)


因此,在与路径、CC和CXX变量进行了大量的斗争之后,我使用MSYS mingw64将其链接起来。我仍然不确定我是否理解如何正确地切换工具链。我试着使用CC和CXX来设置编译器位置,但是如果系统路径上有多个工具链,事情就会变得非常混乱。最后,我不得不将CC和CXX留空,只需确保MSYS路径在路径上的Qt安装之前,以便CMake将其拾取,而无需其他操作。这可能会破坏我其他项目的构建。

运行
mingw32 make VERBOSE=1
查看命令行。检查链接器输入中是否存在库。我尝试过,但不确定是否从中获得了任何信息。我编辑以添加详细的输出。它告诉你什么了吗?CMakeFiles目录中有一个名为linklibs.rsp的文件,其中包含路径“D:/libs/libsndfile/lib/libsndfile-1.a”和一组其他-l。。。flagsI在链接器命令行中看不到
libsndfile-1.lib
,它可能在
CMakeFiles\oslcoda.dir\linklibs.rsp
中,您能显示它的内容吗?当您链接到一个库并且仍然得到“未定义的引用”时,那么您的库不会定义这些符号,或者以与您使用的编译器不兼容的方式定义它们。顺便说一句,您使用
.lib
文件链接,但是
linklibs.rsp
包含
.a
文件。这看起来。。。很奇怪。请更新你的帖子,使输出一致。至于“未解析的符号”-您可以尝试执行给定的命令行(其中包含
linklibs.rsp
)并查看发生了什么。如果您遇到相同的错误,那么问题不在CMake中。