【发布时间】:2019-07-26 07:16:38
【问题描述】:
我正在尝试使用 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 是一些静态库。它位于文件夹../Win32/Debug 相对于CMakeLists.txt 和App.cpp 的位置。
当我开始项目构建时,我在链接器命令行中看到奇怪的选项:
-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 中的错误?
【问题讨论】:
-
无需在
target_link_libraries中指定-l标志,尤其是对于选项-l(和/l)毫无意义的Visual Studio。只需使用target_link_libraries(mainApp lib)。与链接目录类似:选项-L和/L对Visual Studio 没有意义。请改用link_directories(${PROJECT_SOURCE_DIR}/../Win32/Debug)。有关在 CMake 中链接到外部库的可能方式,请参阅 that question。 -
link_directories 不推荐使用:“注意这个命令很少需要,在有其他选择的地方应该避免使用。” cmake.org/cmake/help/v3.13/command/link_directories.html
标签: visual-studio visual-c++ cmake visual-studio-2017 linker