天道酬勤,学无止境

MesonBuild: How to define dependency to a library that cannot be found by `pkg-config`?

My project (in C) has a third party dependency at build time. But the third party library is, by default, installed to /opt/ instead of /lib, and I cannot find it in pkg-config. From mesonbuild's documentation, should I use declare_dependency, I don't have its source code to treat it as my sub-project. If I use dependency() to define it, I can't find the correct argument to define a customized location.

How to declare dependency for a non-standard third party library?

评论

As documented here and here

The main use case for this [declare_dependency()] is in subprojects.

and

[dependency()] finds an external dependency ... with pkg-config [or] library-specific fallback detection logic ...

You can, instead, use find_library() provided by the compiler object and include_directories() . find_library() returns an object just like the one declare_dependency() returns. include_directories() returns an opaque object which contains the directories.

Assuming you are using a C compiler and your 3rd party library and its header file are /opt/hello/libhello.so and /opt/hello/hello.h, you can do:

project('myproj', 'c')

cc = meson.get_compiler('c')
lib_hello = cc.find_library('hello',
               dirs : ['/opt/hello'])
inc_hello = include_directories('/opt/hello')
exec = executable('app',
                  'main.c',
                  dependencies : [lib_hello],
                  include_directories : inc_hello)

Refer to meson object here : current_source_dir() method returns a string to the current source directory.

Use it for the case libhello.so and libhello.h are located in <workspace>/hello directory

<workspace>/main.c
<workspace>/meson.build

<workspace>/hello/libhello.so
<workspace>/hello/libhello.h
<workspace>/hello/meson.build

In <workspace>/hello/meson.build:

lib_hello = cc.find_library('hello', dirs : meson.current_source_dir())

In <workspace>/meson.build:

project('myproj', 'c')
subdir('hello')

inc_hello = include_directories('./')
exec = executable('app',
                  'main.c',
                  dependencies : [lib_hello],
                  include_directories : inc_hello)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Android Studio 3.0编译问题(无法在配置之间选择)(Android Studio 3.0 Compile Issue (Cannot choose between Configurations))
    问题 最新的3.0内部版本(Beta 2)的问题我的项目有一个第三方提供的1个子模块,因此我只能访问其build.gradle。 我的项目有3种口味,即食,燕麦,生产。 每种都有2种构建类型,即调试和发布。 当我尝试构建时,我得到了。 Error:Cannot choose between the following configurations of project :lp_messaging_sdk: - debugApiElements - debugRuntimeElements - releaseApiElements - releaseRuntimeElements All of them match the consumer attributes: - Configuration 'debugApiElements': - Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required. - Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required. - Found com.android.build.gradle.internal
  • 一篇文章深入gradle(上篇):依赖机制
    Hello,各位朋友们,小笨鸟又和你们见面啦。不同于网上泛泛而谈的入门文章只停留在“怎么用”的层次,本篇文章从源码角度去理解gradle。当然,如果你没有看过我的前一篇文章《一篇文章基本看懂gradle》,还是建议你先看一下,本篇文章的很多知识点会在上篇文章的基础上展开。 本篇文章会比较深入,需要费一些脑筋和精力才能理解。建议跟着我的行文思路一步一步理解。本文的篇幅会比较长。阅读大概需要花费半个小时。阅读本文将会了解: gradle构建Lifecyclegradle Extension和Plugingradle依赖实现,Configuration 其中gradle依赖将会是本文的重点。本来之前还想把artifact也讲解到,但是发现篇幅已经很长了,所以就一篇文章拆成两篇吧。 gradle构建Lifecycle Lifecycle的概念我们在上一篇文章讲Project的时候也讲到过。在这篇文章中,我们会再简单讲一讲作为引入。 正如官网所说,gradle构建流程总共为三个阶段: 初始化阶段:在这个阶段中settings.gradle是主角,gradle会把settings.gradle中的配置代理给Settings类。主要负责的是判断哪些module需要参与到构建中,然后根据这些module的设置初始化他们的delegate对象Project。注意
  • Intellij Idea无法解决Maven中的任何问题(Intellij idea cannot resolve anything in maven)
    问题 我是Intellij Idea的新手,我只是使用pom.xml导入项目,但是ide在Maven依赖项中未解决任何问题。 在导入代码时引发错误时, pom.xml依赖项中定义的任何内容均cannot resolve symbol xxxxx 但是mvn install可以工作,我尝试在.jar文件中的Project Settings/Libraries中导入依赖项,然后工作,但是ide可以解析pom.xml定义的库吗? 我不想每次都这样做。 附加信息: IDEA版本:12.0.3,操作系统:Windows 7,重新导入不起作用,maven版本:3.0.4,Exernal库下不存在maven依赖项。 在idea.log中没有例外... 回答1 在IntelliJ 12.1.4中,我经历了Settings --> Maven --> Importing ,并确保选择了以下内容: 自动导入Maven项目为聚合器项目创建IDEA模块保留来源... 排除构建目录... 使用Maven输出... 生成的源文件夹:“自动检测” 要成为的阶段:“过程资源” 自动下载:“源”和“文档” 使用Maven3导入项目导入程序的VM选项:-Xmx512m 这使我从拥有许多未解决的导入语句转移到已解决所有问题。 我认为这里的关键是使用Maven3导入项目。希望这会有所帮助。 回答2 我遇到了这个问题
  • 如何在Gradle中定义编译时“仅”类路径?(How do I define a compile-time *only* classpath in Gradle?)
    问题 有人可以给我一个简单的build.gradle示例,说明如何指定运行时部署(war)中未包含的仅编译时类。 自从“运行时”继承自“编译”以来,Gradle似乎已经走错了路。 我无法想象这样一种情况,我会在运行时想要类,而在编译时却不想。 但是,在许多情况下,我不希望在运行时需要类来在编译时生成代码! 我已经浏览了gra肿的gradle文档,但找不到任何明确的说明或示例。 我怀疑可以通过定义“配置”并将其设置为CompileJava插件的类路径来实现-但文档不足以解释如何实现此目的。 回答1 关于此主题的讨论很多,主要是在这里,但结论不明确。 您的方向正确:目前最好的解决方案是声明您自己provided配置,该配置将包括仅编译的依赖项并添加到您的编译类路径中: configurations{ provided } dependencies{ //Add libraries like lombok, findbugs etc provided '...' } //Include provided for compilation sourceSets.main.compileClasspath += [configurations.provided] // optional: if using 'idea' plugin idea { module{ scopes.PROVIDED
  • How to define v7 appcompat dependency correctly?
    I'm trying to get an (inherited) Android project to build. I'm using Ant & command line tools (and IDEA). In styles.xml, there are references that cannot be resolved such as: <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light"> This is the original error I ran into: [...]/res/values/styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name '@style/Theme.AppCompat.Light'. I then noticed that project.properties has this appcompat reference which is broken on my (OS X) machine: target=android-18 android.library.reference.1=../../../../adt
  • React Hook测试指南
    在React为什么需要Hook中我们探讨了React为什么需要引入Hook这个属性,在React Hook实战指南中我们深入了解了各种Hook的详细用法以及会遇到的问题,在本篇文章中我将带大家了解一下如何通过为自定义hook编写单元测试来提高我们的代码质量,它会包含下面的内容: 什么是单元测试 单元测试的定义为什么需要编写单元测试单元测试需要注意什么 如何对自定义Hook进行单元测试 JestReact-hooks-testing-library例子 什么是单元测试 单元测试的定义 要理解单元测试,我们先来给测试下个定义。用最简单的话来说测试就是:我们给被测试对象一些输入(input),然后看看这个对象的输出结果(output)是不是符合我们的预期(match with expected result)。而在软件工程里面有很多不同类型的测试,例如单元测试(unit test),功能测试(functional test),性能测试(performance test)和集成测试(integration test)等。不同种类的测试的主要区别是被测试的对象和评判指标不一样。对于单元测试,被测试的对象是我们源代码的独立单元(individual unit),在面向过程编程语言(procedural programming)里面,单元就是我们封装的方法(function)
  • scala不显式支持依赖类型的原因是什么?(Any reason why scala does not explicitly support dependent types?)
    问题 存在依赖于路径的类型,我认为可以在Scala中表达Epigram或Agda之类语言的几乎所有功能,但是我想知道为什么Scala不像在其他领域一样很好地支持这种语言(例如,DSLs)? 我是否缺少诸如“没有必要”之类的东西? 回答1 除了语法上的便利,单例类型,路径依赖类型和隐式值的组合意味着Scala对依赖类型有着令人惊讶的良好支持,正如我尝试在无形状中演示的那样。 Scala对依赖类型的内在支持是通过路径依赖类型。 这些允许类型依赖于像这样通过对象(即值)图的选择器路径, scala> class Foo { class Bar } defined class Foo scala> val foo1 = new Foo foo1: Foo = Foo@24bc0658 scala> val foo2 = new Foo foo2: Foo = Foo@6f7f757 scala> implicitly[foo1.Bar =:= foo1.Bar] // OK: equal types res0: =:=[foo1.Bar,foo1.Bar] = <function1> scala> implicitly[foo1.Bar =:= foo2.Bar] // Not OK: unequal types <console>:11: error: Cannot prove that
  • 如何在不安装实际的zxing应用程序的情况下集成Zxing条形码扫描仪(无法解析符号:.android.CaptureActivity)?(How to integrate Zxing Barcode Scanner without installing the actual zxing app (cannot resolve symbol: .android.CaptureActivity)?)
    问题 我想将zxing扫描仪集成到我的应用程序中,而无需外部应用程序(来自Play商店的zxing扫描仪)。 这是我的代码 Button scan = (Button) findViewById(R.id.scan_button); scan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.setPackage("com.mypackage.app"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, SCANNER_REQUEST_CODE); } }); @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == SCANNER_REQUEST_CODE) { // Handle scan intent if (resultCode ==
  • vs 2019编写汇编并运行调试
    前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)汇编代码所以放弃了。 但是我又偶然想起来了,而且偶然找到了高亮插件! (那时查了很多帖子,甚至有人说在某度知道里说vs不能写汇编,我真是对这种不负责任的回答嗤之以鼻, 有个贴吧的帖子说 汇编开发环境,个人建议,如果已经安装了Visual Studio,推荐直接用vs作为开发调试工具,原因很简单,现在用的规则就是masm,微软的规则,没有人比微软更了解微软,而且可以很方便的为后续加入c/c++开发提供一站式的平台,如果没有安装,可以考虑后者Radasm+ Masm32,不要用什么cmd,然后debug。。。愚蠢至极,除了装逼浪费时间,还是装逼浪费时间,并没有半点实际价值。详见http://tieba.baidu.com/p/4827889049 嗯,我很同意上面不是斜体的那段文字(尤其是win10后根本没debug了,还得搞dosbox),所以我又来找vs运行汇编的方法了~ ) 没想到课本上那么少的东西实际运行起来水那么深,深的不是基本语法,而是各种库什么的照搬书上的代码都没法运行,真是……根本不像之前的c语言直接一个f5就完事那么简单。(ps:参考的那几个帖子的代码有的能运行,有的) ====
  • 什么是双亲委派模型?违背双亲委派模型?
    一、先从类加载器讲起 对于任意一个类,被同一个类加载器加载后都是唯一的,但如果被不同加载器加载后,就不是唯一的了。即使是源于同一个Class文件、被同一个JVM加载,只要加载类的加载器不同,那么类就不同。 下面我们写一个不同类加载器加载后的类,看一下对instanceof关键字运算有什么影响: public class OneMoreStudy { public static void main(String[] args) throws Exception { ClassLoader myLoader = new ClassLoader() { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class"; InputStream inputStream = getClass().getResourceAsStream(fileName); if (inputStream == null) { return super.loadClass(name); } byte[] array = new byte[inputStream
  • Gradle 相关问题解决记录 & 疑难杂症记录
    Gradle 相关问题解决记录 双清解决一大部分问题小知识疑难杂症1. 解决在Java7的项目引用了Java8的第三方库:2. 第三方依赖冲突3. 多种风味,设置默认打包渠道,否则可能会导致打不进去包4. 接入三方aar,或者遇到**java.lang.NoClassDefFoundError** 问题5. Unable To Merge Dex6. Failed to execute aapt7. module层级依赖,遇到风味(productFlavors )缺失的问题8. library中有某个demension维度,但是app中没有9. 排除不需要的变体10. 集成第三方SDK android.arch.core.util.Funtion缺少11. Android Studio 3.6以上版本关闭gradle离线版本12. No resource found that matches the given name: attr 'colorPrimaryDark'.13. 强势刷新gradle依赖&& 发布到Maven14. AndroidManifest 读取纯数字meta值java.lang.AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util
  • 尝试创建Gradle构建时出现问题(Problems trying to create gradle build)
    问题 我们最近已从Intellij迁移到Android Studio。 我目前正在尝试迁移我们的项目以使用gradle进行构建。 我尝试将其适合当前的文件夹结构,并尝试迁移文件以匹配gradle文件结构。 我一直都有错误,一直在寻找答案,但是找不到与我们所得到的完全匹配的东西。 尝试迁移到gradle文件结构时遇到的错误是: 什么地方出了错: 配置项目“:”时发生问题。 无法通知项目评估侦听器。 找不到名称为“默认”的配置 我使用旧文件结构时遇到的错误是: :<project>:processDebugResources /Users/kbrown/dev/AndroidClient/<project>/build/res/all/debug/values/values.xml:311: error: Error retrieving parent for item: No resource found that matches the given name '@style/Widget.Sherlock.ActionBar.Solid'. /Users/kbrown/dev/AndroidClient/<project>/build/res/all/debug/values/values.xml:312: error: Error: No resource found that
  • g++编译详解
    g++编译详解 资料准备: 为了方便演示和讲解,在这里提前准备好几个简单的文件:test.cpp test.h main.cpp 文件内容如下: main.cpp #include "test.h" int main (int argc, char **argv) { Test t; t.hello(); return 0; } test.h //test.h #ifndef _TEST_H_ #define _TEST_H_ class Test { public: Test(); void hello(); ~Test(); }; #endif //TEST test.cpp //test.cpp #include "test.h" #include <iostream> using namespace std; Test::Test() { } void Test::hello() { cout << "hello" << endl; } Test::~Test() { } C++的编译过程 一个完整的C++编译过程(例如g++ a.cpp生成可执行文件),总共包含以下四个过程: 编译预处理,也称预编译,可以使用命令g++ -E执行编译,可以使用g++ -S执行汇编,可以使用as 或者g++ -c执行链接,可以使用g++ xxx.o xxx.so xxx.a执行
  • “ Java Build Path”中的“ Order and Export”选项卡(The “Order and Export” tab in “Java Build Path”)
    问题 “ Java构建路径”对话框中的“订购和导出”选项卡有什么用? 用“命令”这个名字,我猜想在插件依赖项之前搜索了JRE系统库,但是为什么我们在构建路径中有“导出”呢? 元素左侧的按钮是什么? 添加 这是我从Eclipse提炼的示例。 orderes.webapp取决于订单,但很可能使用ubl和catalog中定义的类。 在这种情况下,订单可以导出目录和ubl,以便依赖它的软件包可以使用目录和ubl。 还有更多关于“订购和出口”的信息。 选中左侧按钮会修改.classpath文件以添加exported=true例如<classpathentry exported="true" kind="lib" path="lib/log4j-1.2.7.jar"/> 。 src始终处于选中状态,您不能取消选中它。 参考 解释Eclipse .classpath文件。 'kind =“ con”'和'exported =“ true”'是什么意思? 配置Eclipse Java项目 Java构建路径 回答1 此选项卡似乎起到了双重作用(有关详细信息,请参阅此帮助页面的底部)。 一方面,它用作解决相关项目中所用资源的解决顺序(“顺序”部分)。 另一方面,它还用于定义此构建路径的哪些部分对从属项目(那些在“项目”选项卡中列出此项目以供其查看此首选项面板的项目)进行构建的路径(“导出”部分)。
  • arm/tensorflow编译问题汇总
    1.undecl ared inclusion(s) in rule '@protobuf_archive//:python/google/protobuf/internal/_api_implementation.so': missing dependency declarations for the following files included by 'external/protobuf/python/google/protobuf/internal/api_implementation.cc' undeclared inclusion(s) in rule '@com_google_protobuf//:protoc_lib' undeclared inclusion(s) in rule '@protobuf_archive//:python/google/protobuf/internal/_api_implementation.so' C++ compilation of rule '@boringssl//:crypto' failed (Exit 1): gcc failed: er tensorflow use option -std=c99 or -std=gnu99 to compile your code 答:1、 bazel build -
  • 错误LNK2005:_DllMain @ 12已在MSVCRT.lib中定义(error LNK2005: _DllMain@12 already defined in MSVCRT.lib)
    问题 我收到此链接器错误。 mfcs80.lib(dllmodul.obj):错误LNK2005:_DllMain @ 12已在MSVCRT.lib(dllmain.obj)中定义 请告诉我消除此错误的正确方法。 我在Microsoft支持网站上阅读了有关此bug的解决方案,但并没有太大帮助。 我正在将VS 2005与Platform SDK一起使用 回答1 如果您彻底阅读了链接器错误并应用了一些知识,则可以自己解决: 链接器将许多已编译的对象和库链接在一起以获得二进制文件。 每个对象/库描述 它期望在其他对象中出现什么符号它定义了什么符号 如果两个对象定义了相同的符号,则将出现此链接器错误。 在您的情况下,mfcs80.lib和MSVCRT.lib都定义_DllMain @ 12符号。 摆脱错误: 找出您实际需要的两个库中的哪个了解如何告诉链接器不要使用另一个链接器(例如,使用James Hopkin的技巧) 回答2 我有相同的错误消息,但是这里没有答案可以为我解决。 因此,如果在创建使用MFC的DLL项目时遇到此问题,则可以通过输入以下行来解决: extern "C" { int _afxForceUSRDLL; } 到定义了DllMain的cpp文件。 然后使用您自己的DllMain实现,而不是dllmain.obj中的实现。 当我们尝试使用MFC库时
  • 将ATLAS / MKL链接到已安装的Numpy(Link ATLAS/MKL to an installed Numpy)
    问题 TL; DR如何在不重建的情况下将ATLAS / MKL链接到现有的Numpy。 我使用Numpy来计算大型矩阵,但发现它非常慢,因为Numpy仅使用1个核来进行计算。 经过大量搜索后,我发现我的Numpy没有链接到某些优化的库,例如ATLAS / MKL。 这是我的numpy配置: >>>import numpy as np >>>np.__config__.show() blas_info: libraries = ['blas'] library_dirs = ['/usr/lib'] language = f77 lapack_info: libraries = ['lapack'] library_dirs = ['/usr/lib'] language = f77 atlas_threads_info: NOT AVAILABLE blas_opt_info: libraries = ['blas'] library_dirs = ['/usr/lib'] language = f77 define_macros = [('NO_ATLAS_INFO', 1)] atlas_blas_threads_info: NOT AVAILABLE openblas_info: NOT AVAILABLE lapack_opt_info: libraries = [
  • 无法执行dex:多个dex文件定义了Lbolts / AggregateException(Unable to execute dex: Multiple dex files define Lbolts/AggregateException)
    问题 我确实知道之前已经多次报告了多个dex问题,但是在我的情况下,所有解决方案似乎都不起作用。 安慰: Unable to execute dex: Multiple dex files define Lbolts/AggregateException; Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lbolts/AggregateException; 流行的解决方案之一是从buildpath取消标记“ Android私有库”容器。 我不能这样做,因为我需要在该容器中添加一些库。 另一个解决方案是取消标记以.jar形式显式添加的任何重复库。 我没有这样的图书馆。 在我的情况下,重复的库是: android-support-v7-appcompat.jar在以下两个容器中有它(直接从sdk文件夹引用): 1.)Android私有库 2.)Android依赖项 问题在于我无法完全取消选中这两个容器中的任何一个,因为它们都包含其他必要的库。 但我也无法从两个容器中仅删除此重复的.jar文件。 编辑:注意:当我将android-support-v7-appcompat library_project添加到我的项目时,它会进入两个容器。
  • 使用CMake仅构建一次外部库(Build external library only once with CMake)
    问题 我的C ++项目包含第三方库的源代码(当前为git子模块)。 该库通过使用add_subdirectory通过我们的主要CMakelists添加到项目中,然后将该库与主要目标链接。 这是我当前的Cmake文件的简化版本: add_subdirectory(foo) set(FOO_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/libfoo/libfoo.so) add_executable(target main.cpp) add_dependencies(target foo) target_link_libraries(target ${FOO_LIBRARY}) 该库需要很长时间才能构建,并且由于我不更改其代码,因此只需要构建一次(每个构建配置)。 但是,当我清理并重建代码时,也会清理库文件并重新编译它们。 我试图在库的目录中设置属性CLEAN_NO_CUSTOM,但是根据文档,它仅适用于自定义命令目标。 CMake中是否有一种机制可以指定仅一次生成该库目标,或者不通过make clean清除该库目标? 回答1 正如@Tsyvarev所说,在您的情况下, ExternalProject_Add优于add_subdirectory 。 当您希望项目成为构建系统的重要组成部分时, add_subdirectory很好
  • 大佬手把手教你如何仿写出大厂的APP,知乎上转疯了!
    前言 这份Android面试真题涵盖了图片,网络和安全机制,网络,数据库,插件化、模块化、组件化、热修复、增量更新、Gradle,架构设计和设计模式,Android Framework 、Android优秀三方库源码等。适合中高级工程师。 背景介绍 Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。 在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6