CMake在Windows上与DLL链接-未定义参考

时间:2020-02-04 11:11:44

标签: c++ cmake mingw

我正在尝试使用CMake与DLL可执行文件链接。这在Linux(当然与.so)上正常工作,但是在Windows上似乎很棘手。我以为可能是其他一些依赖关系,所以我尝试创建一个简单的测试程序,但是我也无法使它正常工作。

我的文件夹结构很简单:

main.cpp
CmakeLists.txt
lib/libtest.dll
lib/CMakeLists.txt

我将此结构基于另一个被问到的question的答案。 不幸的是,当我构建时,它失败了。

lib/CMakeLists.txt的内容是:

message("-- Linking Test")
add_library(TEST libtest.dll)
set_target_properties(TEST PROPERTIES LINKER_LANGUAGE C)

主要CMakeLists.txt的内容为:

cmake_minimum_required(VERSION 3.15)
project(Test_program)

set(CMAKE_CXX_STANDARD 14)
set(GCC_COVERAGE_COMPILE_FLAGS "-DDebug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

# Contain the header files for testlib
include_directories("C:/test/utils/")
add_subdirectory(lib)


add_executable(Test_program main.cpp)
target_link_libraries(Test_program TEST)

这将产生以下输出:

-- Linking Test
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/akda/Test_program/cmake-build-debug
[ 33%] Linking C static library libTEST.a
[ 33%] Built target TEST
[ 66%] Building CXX object CMakeFiles/Test_program.dir/main.cpp.obj
[100%] Linking CXX executable Test_program.exe
CMakeFiles\Test_program.dir/objects.a(main.cpp.obj): In function `powerOn()':
C:/Users/akda/Test_program/main.cpp:8: undefined reference to `My_Library_Function'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [CMakeFiles\Test_program.dir\build.make:87: Test_program.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:77: CMakeFiles/Test_program.dir/all] Error 2
mingw32-make.exe: *** [Makefile:83: all] Error 2

使用DLLExportViewer这样的工具,我可以确认DLL实际上包含所调用的函数。 我究竟做错了什么?我永远不会声称自己是CMake的专家,但我真的看不出有什么问题。

使用指向.a文件的链接进行更新 如前所述,我可以尝试与.a文件链接。 我已将此添加到库文件夹,并将主CMakeLists.txt更改为以下内容:

cmake_minimum_required(VERSION 3.15)
project(Test_program)

set(CMAKE_CXX_STANDARD 14)
set(GCC_COVERAGE_COMPILE_FLAGS "-DDebug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )


include_directories("C:/test/utils/")

find_library(TEST ${CMAKE_SOURCE_DIR}/lib/libtest.a)


add_executable(Test_program main.cpp)
target_link_libraries(Test_program ${TEST})

结果以相同的方式出现,并出现相同的错误。

0 个答案:

没有答案