介子不链接共享库

Posted

技术标签:

【中文标题】介子不链接共享库【英文标题】:Meson doesn't link shared library 【发布时间】:2021-01-20 11:33:46 【问题描述】:

我的项目结构如下:

$ find ~/template
template/
template/meson.build
template/src
template/src/template
template/src/template/geometry.cc
template/src/template/geometry.hh
template/src/template/main.cc
template/src/template/meson.build
template/src/meson.build

相关文件:

$ cat ~/template/src/template/geometry.hh
#ifndef GEOMETRY_H
#define GEOMETRY_H

template <class T>
class Circle 
    public:
        Circle(T radius);
        T area() const;
        T radius() const;
    private:
        T _radius;
;
#endif
$ cat ~/template/src/template/geometry.cc
#include <numbers>
#include "geometry.hh"

template <class T>
Circle<T>::Circle(T radius): _radius(radius) 

template <class T>
T Circle<T>::area() const 
    return std::numbers::pi * _radius * _radius;


template <class T>
T Circle<T>::radius() const 
    return _radius;


template class Circle<float>;
$ cat ~/template/src/template/main.cc
int main() 
    Circle<float> fc(3.0f);
    return 0;

$ cat ~/template/src/template/meson.build
geometry = shared_library(
  'geometry',
  sources: ['geometry.cc']
)

executable(
  'app',
  link_with: geometry,
  sources: ['main.cc'],
  include_directories: src
)

尝试构建失败,未定义对 Circle 类的引用,由于 .cc 文件中的显式模板实例化,它应该存在,并且 shared_library 应该自动加载,因此不需要显式包含指令。

$ ~/template/build$ ninja
[0/1] Regenerating build files.
The Meson build system
Version: 0.53.2
Source dir: /home/afficionado/template
Build dir: /home/afficionado/template/build
Build type: native build
Project name: template
Project version: 0.0.0
C++ compiler for the host machine: c++ (gcc 10.2.0 "c++ (GCC) 10.2.0")
C++ linker for the host machine: c++ ld.bfd 2.34
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 2

Found ninja-1.10.0 at /gnu/store/2qk7mi55czwj92hkdgfrcljwdbb3cx4p-profile/bin/ninja
[1/3] Compiling C++ object 'src/template/9deed4d@@app@exe/main.cc.o'.
FAILED: src/template/9deed4d@@app@exe/main.cc.o
c++ -Isrc/template/9deed4d@@app@exe -Isrc/template -I../src/template -Isrc -I../src -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -std=c++2a -g -MD -MQ 'src/template/9deed4d@@app@exe/main.cc.o' -MF 'src/template/9deed4d@@app@exe/main.cc.o.d' -o 'src/template/9deed4d@@app@exe/main.cc.o' -c ../src/template/main.cc
../src/template/main.cc: In function ‘int main()’:
../src/template/main.cc:2:5: error: ‘Circle’ was not declared in this scope
    2 |     Circle<float> fc(3.0f);
      |     ^~~~~~
../src/template/main.cc:2:12: error: expected primary-expression before ‘float’
    2 |     Circle<float> fc(3.0f);
      |            ^~~~~

也许需要一些特定的参数来实现这一点,但我对 Meson 比较陌生,在其文档中找不到任何示例

【问题讨论】:

【参考方案1】:

您在 main.cc 文件中忘记了 #include "geometry.hh"。这就是它找不到Circle 类声明的原因。

【讨论】:

以上是关于介子不链接共享库的主要内容,如果未能解决你的问题,请参考以下文章

静态库,链接到共享库

Linux:链接共享库时如何使用 .pc 文件?

C++基础语法梳理:链接装载库丨Linux 的共享库

链接 AIX 上的共享库

强制 GCC 通知共享库中未定义的引用

构建链接到其他非标准共享库的共享库