如何链接到cmake add_subdirectory生成的so文件?

问题描述 投票:0回答:2

我见过类似的问题,但我无法理解该接受的答案。

我的项目结构是这样的

├── CMakeLists.txt
├── main.cpp
└── plugins
    ├── CMakeLists.txt
    ├── plugin.cpp
    └── plugin.h

CMakeLists.txt
的内容是这样的:

# top-level CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.22)

PROJECT(example)

add_subdirectory(./plugins/)

add_executable(main main.cpp)
target_include_directories(main PUBLIC ./plugins/)
target_link_libraries(main -lplugin)

./plugins/文件夹中的CMakeLists.txt

add_library(plugin SHARED plugin.cpp)

代码是这样的:

// main.cpp
#include <iostream>
#include "plugin.h"


int call() {
    using namespace std;
    cout << "call\n";
    func();
}

int main() {
    call();
    return 0;
}

// plugins/plugin.cpp
#include <iostream>

void func() {
    using namespace std;
    cout << "plugin\n";
}

// plugins/plugin.h
void func();

当我编译这个时,我得到了错误

make[2]: *** No rule to make target 'plugins/libplugin.so', needed by 'main'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

你能告诉我如何做到这一点吗?

c++ cmake
2个回答
0
投票

如果您将

target_link_libraries
呼叫更改为以下内容:

target_link_libraries(main PUBLIC plugin)

CMake 将:

  1. 添加从
    main
    目标到
    plugin
    目标的依赖关系。
  2. 配置
    main
    ,使其知道在哪里可以找到
    libplugin.so

0
投票

你必须使用

target_link_libraries(main plugin)

target_link_libraries

的文档中所述

target_link_libraries(<target> ... <item>... ...)

每个可能是:

  • 库目标名称:生成的链接行将具有与目标关联的可链接库文件的完整路径。如果库文件发生更改,构建系统将具有重新链接的依赖项。 [..]
  • 链接标志:以
    -
    [..]
    开头的项目名称 此处指定的链接标志将插入到链接命令中

因此库目标添加了对目标的依赖关系,而链接标志则没有。

© www.soinside.com 2019 - 2024. All rights reserved.