我在一个c++项目中使用meson-build。我创建了一个名为libs的目录,并将我需要的所有库都放在其中,我如何与它链接?
meson-build
libs
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.您不希望链接不需要的库,因为它们可能会将恶意代码插入到您的应用程序中(例如,您的同事可能会在该文件夹中植入恶意库,您永远不会知道,但您的应用程序中有后门)
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])
谢谢你的提示。
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()
3条答案
按热度按时间knpiaxh11#
阅读meson's dependencies manual之后,我觉得它没有这样的选项,你应该为你想链接的每个库指定一个依赖项。
下面是手册中的一个片段,说明如何使用自己的库:
但是这是最好的,因为你应该非常小心地控制链接库,为什么?
1.即使未解析所有符号,链接也可以成功,并且应用程序仅在运行时崩溃。
1.如果有多个库具有相同的符号,则需要控制链接顺序
1.您不希望链接不需要的库,因为它们可能会将恶意代码插入到您的应用程序中(例如,您的同事可能会在该文件夹中植入恶意库,您永远不会知道,但您的应用程序中有后门)
5rgfhyps2#
好吧,这就是我要找的,
谢谢你的提示。
1hdlvixo3#
我把所有的文件条目读入一个变量中,然后解析它们以得到一个简短的库名,这要归功于regexp,然后循环它们以将它们链接到我的客户端库(在我的例子中是导入的库):