我正在尝试使用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})
结果以相同的方式出现,并出现相同的错误。