gpt4 book ai didi

cmake - 如何修复此 cmake 文件? - 链接到导入库的问题

转载 作者:行者123 更新时间:2023-12-02 07:52:09 24 4
gpt4 key购买 nike

我刚开始使用 cmake,并尝试建立一个相当简单的项目。虽然项目本身很简单,但它链接到许多不是由 cmake 构建的静态库。我想它们可能是——它们是我的库——但无论如何我都需要弄清楚如何链接到第三方库。

这是我目前所拥有的...

cmake_minimum_required(VERSION 2.8.1)
cmake_policy(VERSION 2.8.1)

project( test01 )

include_directories("../../cpplib/sh_core" "../../cpplib/sh_core2" "../../cpplib/sh_genlib")

link_directories("../../cpplib/_vc_debug")

add_library( sh_core STATIC IMPORTED )
add_library( sh_core2 STATIC IMPORTED )
add_library( sh_genlib STATIC IMPORTED )

add_executable( test01 test01 test01_ast test01_parse test01_scan test01_main )
target_link_libraries(test01 sh_core sh_core2 sh_genlib)

问题是我试图链接到的三个库在生成的项目文件中没有被正确引用。它们被列为 sh_core-NOTFOUNDsh_core2-NOTFOUNDsh_genlib-NOTFOUND

认为也许我不需要上面的link_directories,但我确实需要一个find_library 命令。但是我快速浏览了文档中的那个命令,然后......WTF!我已经很头疼了,我实在应付不了那一堆看似冗余复杂的ATM。此外,看到本应非常简单的东西如此复杂,这让我觉得我找错地方了。

那么...我如何告诉 cmake 在哪里可以找到这些库?

奖金问题 - 我如何设置它以便生成的项目处理调试构建和发布构建?注意 - 导入库的发布版本具有相同的文件名,但位于“../../cpplib/_vc_release”文件夹中。

最佳答案

我认为您误解了 include_directoriesadd_library指令。

include_directories 添加要搜索包含文件的目录,而 add_library 可以像这样使用(在您的情况下):

add_library(core UNKNOWN IMPORTED)
set_target_properties(core PROPERTIES IMPORTED_LOCATION "../../cpplib/_vs_release/core.lib")

但是,如果我正确地理解了您要完成的任务,那么应该这样做:

set(CPPLIB_DIR "${CMAKE_SOURCE_DIR}/../../cpplib")

set(CPPLIB_DEBUG_DIR "${CPPLIB_DIR}/_vc_debug")
set(CPPLIB_RELEASE_DIR "$(CPPLIB_DIR}/_vc_release")

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
set(CPPLIB_LIB_HINT ${CPPLIB_RELEASE_DIR})
else ()
set(CPPLIB_LIB_HINT ${CPPLIB_DEBUG_DIR})
endif ()

find_library(CPPLIB_CORE_LIBRARY NAMES "core"
PATHS ${CPPLIB_LIB_HINT})

find_library(CPPLIB_CORE2_LIBRARY NAMES "core2"
PATHS ${CPPLIB_LIB_HINT})

find_library(CPPLIB_GENLIB_LIBRARY NAMES "genlib"
PATHS ${CPPLIB_LIB_HINT})

if (("${CPPLIB_CORE_LIBRARY}" STREQUAL "CPPLIB_CORE_LIBRARY-NOTFOUND") OR
("${CPPLIB_CORE2_LIBRARY}" STREQUAL "CPPLIB_CORE2_LIBRARY-NOTFOUND") OR
("${CPPLIB_GENLIB_LIBRARY}" STREQUAL "CPPLIB_GENLIB_LIBRARY-NOTFOUND"))
message(FATAL_ERROR "One of the libs wasn't found!")
endif ()

set(CPPLIB_LIBRARIES ${CPPLIB_CORE_LIBRARY} ${CPPLIB_CORE2_LIBRARY} ${CPPLIB_GENLIB_LIBRARY})

target_link_libraries(my_exe ${CPPLIB_LIBRARIES})

编辑:如果您还想包含一些 header ,很简单:

find_path(CPPLIB_INCLUDE_DIR "my_header.h"
PATHS ${CPPLIB_HINT_INCLUDE_DIR})

...

include_directories(${CPPLIB_INCLUDE_DIR})

关于cmake - 如何修复此 cmake 文件? - 链接到导入库的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3100252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com