我正在尝试将一个大项目(包含可执行文件、动态库和静态库)转换为使用 CMake 构建系统。我在向静态库添加依赖项时遇到问题。
我有一个根 CMake,它将调用子目录列表
cmake_minimum_required(VERSION 3.8.0)
project(CC)
add_subdirectory(SmartCardUtility)
add_subdirectory(CertificateUtil)
..
CertificateUtil 下的 CMakeLists.txt 文件如下所示。
project(CertificateUtil CXX)
source grouping....
include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../../Output/_INC_DEV")
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../OpenSSL")
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
target_link_libraries(${PROJECT_NAME} libcrypto)
在上面的代码中,如果将 add_library 替换为 add_executable 或 add_library with SHARED,则依赖关系将被正确解析并显示在Additional_Dependencies 中,但对于静态库,属性页中的Additional_Dependencies 始终为空。
在网上冲浪之后,我了解到 target_link_libraries 命令不会在 Librarian 中添加任何内容。那么问题是,向静态库添加依赖项的正确方法是什么,以便它们显示在 Librarian 下的 Another_Dependencies 中?
我尝试将依赖项添加为导入对象,如下所示,但仍然不起作用。
add_library(libcrypto OBJECT IMPORTED)
set_property(TARGET libcrypto PROPERTY IMPORTED_OBJECTS "${CMAKE_CURRENT_SOURCE_DIR}/../../OpenSSL/libcrypto.lib")
add_library(${PROJECT_NAME} STATIC ${ALL_FILES} $<TARGET_OBJECTS:libcrypto>)
我在 CMake 的 gitlab 上看到了类似的问题https://gitlab.kitware.com/cmake/cmake/-/issues/16931.
有人建议使用:
set ( CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} somelib.lib" )
这对我有用,我能够复制 Visual Studio 的 Librarian Addition Dependency。我认为你可以通过添加来解决这个问题:
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} libcrypto")
您可以列出不同库的多个路径,它们将包含在生成的 .lib 文件中