我正在尝试使用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中的错误?
答案 0 :(得分:0)
@Tsyvarev是正确的;在CMake中使用-l
时,无需操心-L
或target_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_DIR
或CMAKE_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
。