c++ 如何链接目录中的所有库?

ars1skjm  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(170)

我在一个c++项目中使用meson-build
我创建了一个名为libs的目录,并将我需要的所有库都放在其中,我如何与它链接?

knpiaxh1

knpiaxh11#

阅读meson's dependencies manual之后,我觉得它没有这样的选项,你应该为你想链接的每个库指定一个依赖项。
下面是手册中的一个片段,说明如何使用自己的库:

my_inc = include_directories(...)
my_lib = static_library(...)
my_dep = declare_dependency(link_with : my_lib, include_directories : my_inc)

但是这是最好的,因为你应该非常小心地控制链接库,为什么?

1.即使未解析所有符号,链接也可以成功,并且应用程序仅在运行时崩溃。
1.如果有多个库具有相同的符号,则需要控制链接顺序
1.您不希望链接不需要的库,因为它们可能会将恶意代码插入到您的应用程序中(例如,您的同事可能会在该文件夹中植入恶意库,您永远不会知道,但您的应用程序中有后门)

5rgfhyps

5rgfhyps2#

好吧,这就是我要找的,

cmplr = meson.get_compiler('cpp')
    mylib1 = cmplr.find_library('lib_name1', dir : 'path_to_directory')
    mylib2 = cmplr.find_library('lib_name2', dir : 'path_to_directory')
    ....
    executable(.... , dependencies : [mylib1, mylib2])

谢谢你的提示。

1hdlvixo

1hdlvixo3#

我把所有的文件条目读入一个变量中,然后解析它们以得到一个简短的库名,这要归功于regexp,然后循环它们以将它们链接到我的客户端库(在我的例子中是导入的库):

set(LIBS_DIR ${CMAKE_CURRENT_LIST_DIR}/../SMP/libs)
file(GLOB LIBS_FULL_NAME ${LIBS_DIR}/*.so)
message(STATUS "LIBS ${LIBS_FULL_NAME}")

FOREACH(LIB_FULL_NAME ${LIBS_FULL_NAME})
    message(STATUS "${LIB_FULL_NAME}")
    string(REGEX REPLACE "^.+/lib(.+).so$" "\\1" LIB_NAME ${LIB_FULL_NAME})
    message(STATUS "LIB_NAME ${LIB_NAME}")

    add_library( ${LIB_NAME}
            SHARED
            IMPORTED )

    set_target_properties( # Specifies the target library.
            ${LIB_NAME}

            # Specifies the parameter you want to define.
            PROPERTIES IMPORTED_LOCATION

            # Provides the path to the library you want to import.
            ${LIB_FULL_NAME} )

    target_link_libraries(clientlib ${LIB_NAME})
ENDFOREACH()

相关问题