Visual Studio中的CMake命令target_link_libraries

时间:2019-07-26 07:16:38

标签: visual-studio visual-c++ cmake visual-studio-2017 linker

我正在尝试使用CMake和Visual C ++ 2017工具链构建跨平台项目。

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)

project(CMakeLibTest)

add_executable(mainApp App.cpp)

target_include_directories(mainApp PRIVATE ${PROJECT_SOURCE_DIR}/../Lib)
target_link_libraries(mainApp -L${PROJECT_SOURCE_DIR}/../Win32/Debug -lLib)

Lib.lib是一些静态库。相对于CMakeLists.txt和App.cpp的位置,它位于文件夹../Win32/Debug中。

启动项目构建时,在链接器命令行中看到奇怪的选项:

-LC:/Users/UserName/source/repos/CMakeLibTest/App/../Win32/Debug -lLib.lib

链接器无法识别这些选项并显示警告:

warning LNK4044: unrecognized option '/LC:/Users/UserName/source/repos/CMakeLibTest/App/../Win32/Debug'; ignored
warning LNK4044: unrecognized option '/lLib.lib'; ignored

最后失败了:

error LNK2019: unresolved external symbol "void __cdecl f(void)" (?f@@YAXXZ) referenced in function main

期望正确的链接器命令行选项:

/LIBPATH:"C:\Users\UserName\source\repos\CMakeLibTest\Win32\Debug\" "Lib.lib"

我做错了什么?在与Visual Studio兼容的CMake中链接库的正确方法是什么?也许这是CMake中的错误?

1 个答案:

答案 0 :(得分:0)

@Tsyvarev是正确的;在CMake中使用-l时,无需操心-Ltarget_link_libraries标志。另一个链接的问题是建议将其他DLL依赖项作为导入的库。这是您的示例的样子:

# Add the static library 'Lib.lib', marking it as an IMPORT.
add_library(MyLib STATIC IMPORTED)
# Define the location of the library dependency.
set(MYLIB_FILE_PATH "C:/Users/UserName/source/repos/CMakeLibTest/Win32/Debug/Lib.lib")
# Tell CMake where to find the library.
set_target_properties(MyLib PROPERTIES IMPORTED_LOCATION ${MYLIB_FILE_PATH})

请注意,如果Win32是您的CMake构建目录,则可以仅使用CMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIR来获取Lib.lib的位置。

# Add the static library 'Lib.lib', marking it as an IMPORT.
add_library(MyLib STATIC IMPORTED)
# Tell CMake where to find the library.
set_target_properties(MyLib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/Debug/Lib.lib)

由于您使用的是Visual Studio,因此我建议您检查IMPORTED_LOCATION的“调试/发布”选项。

现在,您可以使用target_link_libraries链接导入的库:

target_link_libraries(mainApp MyLib)

重要说明::如果您使用CMake在与Lib.lib相同的源代码树中配置和构建mainApp,则可以跳过IMPORTED步骤,并只需如上所述调用target_link_libraries

相关问题