gpt4 book ai didi

CMake : how to link a library WITHOUT automatic search function FIND_PACKAGE?

转载 作者:行者123 更新时间:2023-12-03 20:28:03 24 4
gpt4 key购买 nike

我想知道如何在没有任何 FIND_PACKAGE 的情况下查找/链接库。

假设我们有一个名为 teSTLib 的“个人”库:

/perso/testlib/include/testlib1.h
/perso/testlib/include/testlib2.h
/perso/testlib/lib/testlib1.a
/perso/testlib/lib/testlib2.a

如何将其与 CMake 链接?

1)在 CMakeLists.txt 的代码中直接链接它的函数是什么?

2)如何让用户选择文件在哪里?

3) 我很难理解 CMake 解释的内容和不解释的内容。例如,如果您定义一个变量 ${MYVARIABLE_INCLUDE_DIR} 或 ${MYVARIABLE_LIBRARIES} 是“INCLUDE_DIR”或“LIBRARIES”,CMake 解释的扩展或者我调用这个变量 ${MYVARIABLE_INCDIR} 没有区别?

4) 如果您的库在 lib 目录中包含十个或更多库文件,如何执行相同的程序(包括“个人”库)?

5) 最后,当你输入 TARGET_LINK_LIBRARIES(myexecutable gmp) ,你怎么知道库的名字是“gmp”。为什么不是“GMP”或“GMP”?放入此函数的库名称是否等于 .a 文件减去 "lib"和 ".a"?例如 libgmp.a -> gmp ?如果我想链接一个名为 libteSTLolexample.a 的库,是否必须输入 TARGET_LINK_LIBRARIES(myexecutable testlolexample)? ?

非常感谢你。

最佳答案

您可以使用 target_link_libraries(myexecutable mylib)链接到库“mylib”。编译器将使用其默认方式来查找指定的库(例如,它将在 Linux 上查找 libmylib.a)。编译器只会查看 link_directories(directory1 directory2 ...) ,因此您可以尝试使用该命令将所需的目录添加到搜索路径中。

当“mylib”也用 CMake 编译时,这将被识别并且一切都应该自动运行。

当您希望用户指定一个目录时,您可以使用缓存的 CMake 变量。 set(MYPATH "NOT-DEFINED" CACHE PATH "docstring") .

对于更复杂的东西,建议编写一个可以与 find_package 一起使用的 CMake 查找模块。 .我建议你看看FindALSA.cmake这可以作为一个很好的起点。

有趣的部分在最后:

if(ALSA_FOUND)
set( ALSA_LIBRARIES ${ALSA_LIBRARY} )
set( ALSA_INCLUDE_DIRS ${ALSA_INCLUDE_DIR} )
endif()

mark_as_advanced(ALSA_INCLUDE_DIR ALSA_LIBRARY)
ALSA_LIBRARYALSA_INCLUDE_DIR变量是用户可配置的并存储在缓存中,而 ALSA_LIBRARIESALSA_INCLUDE_DIRS以及 ALSA_FOUND得到计算,并且是 find 模块的用户应该使用的。

通常人们会像这样使用 find 模块:
find_package(ALSA REQUIRED)
include_directories(${ALSA_INCLUDE_DIRS})
target_link_libraries(myexe ${ALSA_LIBRARIES})

我相信您可以将其改编为您的个人图书馆。

关于CMake : how to link a library WITHOUT automatic search function FIND_PACKAGE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984479/

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